7

在 Kotlin 中,我只想在另一个变量不为空(否则,没有操作)时才进行赋值。我可以想到两种简洁的方法:

fun main(args: Array<String>) {
    var x: Int? = null
    var n = 0

    // ... do something ...

    x?.let { n = it }  // method 1
    n = x ?: n         // method 2
}

然而,考虑到我必须做的频率,它们感觉不够简洁。第一种方法似乎有点矫枉过正。第二种方法是唠叨要求 after 的表达式?:

我怀疑一定有更好的方法,比如n =? x?或者n = x??在那儿?

4

2 回答 2

1

尝试infix模拟自定义中缀操作

// define this
infix fun <T > T.assignFromNotNull(right: T): T = right ?: this

///////////////////////////////////////////////////////////
// Demo using

// Now, Kotlin infix-style
fooA assignFromNotNull fooB
barA assignFromNotNull barB
bazA assignFromNotNull bazB

// Old code, Java if-style
if (fooB != null) {
    fooA = fooB;
}
if (barB != null) {
    barA = barB;
}
if (bazB != null) {
    bazA = bazB
}
于 2018-03-02T03:17:26.993 回答
0

有以下几点:

val x: Int? = null
val n: Int = x ?: return

这编译得非常好,即使n可能没有被分配。n甚至允许在其“赋值”之后使用的调用,例如println(n),因为编译器只知道那nInt并且那没关系。但是,赋值之后的任何行都将永远不会被调用,因为我们return来自范围。取决于你想要什么,这是一个无操作。我们无法继续,因为n无法分配,所以返回。

另一种选择是如果应该在其他地方处理val n: Int = x!!,它将抛出一个。我不推荐这种做法,因为 Kotlin 提供了更简洁的方法来处理可空性。NullPointerExceptionx == null

于 2017-12-27T00:42:30.607 回答