什么? 在Kotlin中是否指派任务的左侧?

根据Kotlin文档 ,? 运算符表示“安全调用”,这意味着如果它在方法调用链中使用,则整个链将返回null(如果它使用的值为null)。

但是如果在作业的左侧使用它呢? 由于左侧不是“返回”任何一方,似乎可能有不同的效果。 这是我正在谈论的一个例子:

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

2 Solutions collect form web for “什么? 在Kotlin中是否指派任务的左侧?”

这意味着,如果左侧的一个安全调用失败(即其接收方为空),则整个分配将被跳过,而右侧的表达式根本不会被计算。

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

(可运行演示)

我刚刚在Kotlin看到一个有趣的问题和答案。 即使答案是非常好的,但我想更详细地澄清它。

下面的赋值表达式:

 myObj?.property = SomeClass.someFunc() 

被Kolin转换成Java字节码如下:

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

所以在多线程中没有问题。 它仍然正常工作,我已经在github上进行了测试。 但是它会导致线程干扰问题,这意味着当myObj被改变时它将修改不同引用的property

除了赋值表达式可以被短路 ,其他的也可以被短路 。 例如:

 val array:Array<Any>? = null; // v--- short-circuited array?.set(0,SomeClass.someFunc()); // ^--- never be called 
  • lateinit属性主持人还没有被EasyMVP,Robolectric和Kotlin初始化
  • 当我期望两个函数时,如何只传递一个参数给函数?
  • 在Kotlin中的Lambda表达式
  • 是否有可能将kotlin中的高阶函数映射到字符串
  • Kotlin为lambda生成内部类
  • Kotlin:Kotlin脚本(.kts)不能使用常规代码?
  • Kotlin Json解析器
  • 使用Spring Boot和Kotlin无法提供动态Web内容
  • 我可以用Codename One使用Kotlin吗?
  • 使用意向操作在Android Studio中创建Kotlin类
  • 无法从innerclass访问变量:Kotlin android
  • Kotlin language will be the best programming language for Android.