Подтвердить что ты не робот

Что значит?. означает в Котлине при использовании в левой части задания?

В соответствии с Kotlin docs,. оператор представляет собой "безопасный вызов", а это означает, что если он используется в цепочке вызовов метода, вся цепочка вернет значение null, если значение того, что оно использует, равно null.

Но как быть, если он используется в левой части задания? Поскольку левая сторона не является стороной, которая "возвращает" что-либо, похоже, что она, вероятно, имеет другой эффект. Вот пример того, что я говорю:

val myObj = SomeObj()
myObj?.property = SomeClass.someFunc() // What does ?. do in this context?
4b9b3361

Ответ 1

Это означает, что если один из безопасных вызовов в левой части не работает (т.е. его приемник равен нулю), то все присваивание пропускается, а выражение в правой части вообще не оценивается.

val nullable: Container? = null
nullable?.x = f() // f is not called

(runnable demo)

Ответ 2

Сейчас я вижу забавный вопрос и ответ в Котлине. Даже если ответ очень приятный, но я хочу уточнить его более подробно.

Выражение присваивания ниже:

myObj?.property = SomeClass.someFunc() 

преобразуется в байт-код Java by Kolin, как показано ниже:

val it = myObj;

if(it != null){
   it.property = SomeClass.someFunc(); 
}

поэтому нет проблем в нескольких потоках. Он все еще отлично работает, и я проверил его на github. Но это приведет к проблеме Thread Interference, что означает, что она изменит property на разные ссылки при изменении myObj.

За исключением того, что выражение присваивания может быть закорочено, другие также могут быть закорочены. Например:

val array:Array<Any>? = null;

//   v--- short-circuited
array?.set(0,SomeClass.someFunc());
//                     ^--- never be called