Что значит?. означает в Котлине при использовании в левой части задания?
В соответствии с Kotlin docs,. оператор представляет собой "безопасный вызов", а это означает, что если он используется в цепочке вызовов метода, вся цепочка вернет значение null, если значение того, что оно использует, равно null.
Но как быть, если он используется в левой части задания? Поскольку левая сторона не является стороной, которая "возвращает" что-либо, похоже, что она, вероятно, имеет другой эффект. Вот пример того, что я говорю:
val myObj = SomeObj()
myObj?.property = SomeClass.someFunc() // What does ?. do in this context?
Ответы
Ответ 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