在Java中,有一个语法糖结构,assignment chaining如下所示:
public class Cat {
String firstName;
String lastName;
Cat() {
lastName = firstName = "Matroskin"; // compiles!
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在 Kotlin 中准确地执行此操作?
这在 Java 中有效,因为赋值是计算所分配值的表达式。但是,Kotlin 中的赋值不是表达式,因此无法使用相同的语法。
如果您想避免编写"Matroskin"两次,可以使用许多可用的作用域函数之一。我会用let:
"Matroskin".let {
firstName = it
lastName = it
}
Run Code Online (Sandbox Code Playgroud)
由于这是在构造函数中,因此您还可以执行以下操作:
var firstName = "Matroskin"
var lastName: String
init {
lastName = firstName
}
Run Code Online (Sandbox Code Playgroud)
(此部分仅供娱乐)
也就是说,从技术上讲,您可以通过定义一个名为 的中缀函数来滥用 Kotlin 的功能来实现类似的语法=。
infix fun <T> T.`=`(prop: KMutableProperty<T>): T {
prop.setter.call(prop)
return this
}
Run Code Online (Sandbox Code Playgroud)
"Matroskin" `=` ::lastName `=` ::firstName
Run Code Online (Sandbox Code Playgroud)
请注意,要分配的值首先排序,因为中缀函数是左关联的。您可以=使用相反的参数进行声明,但使用时需要括号:
::lastName `=` (::firstName `=` "Matroskin")
Run Code Online (Sandbox Code Playgroud)
另外,这不算作初始化属性,因此如果您不给它们默认值, Kotlin 会抱怨firstName和不会被初始化:lastName
var firstName = ""
var lastName = ""
Run Code Online (Sandbox Code Playgroud)
如果你使用的是vals,那么这种方式不适用。
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |