如果满足某些条件,如何在 for-comprehension 中产生 None
How to yield None in for-comprehension if some condition meets
我正在尝试理解并编写了以下代码:
object Main extends App {
val resultOption: Option[Int] =
for{
i1 <- opt1
i2 <- opt2
} yield {
if(i1 + i2 > 10) null.asInstanceOf[Int]
else i1 + i2
}
println(resultOption) // <---- Here
def opt1: Option[Int] = //some computations
def opt2: Option[Int] = //some computations
}
我希望 resultOption
成为 None
以防满足条件,但返回 Some(0)
。我查看了 yield 块的编译代码,我们这里有:
Code:
0: aload_0
1: getfield #25 // Field i1:I
4: iload_1
5: iadd
6: bipush 10
8: if_icmple 18
11: aconst_null
12: invokestatic #31 // Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
15: goto 24
18: aload_0
19: getfield #25 // Field i1:I
22: iload_1
23: iadd
24: ireturn
在 12:
我们调用 BoxesRunTime.unboxToInt(null)
确实 returns 0
。问题是在 i1 + i2 > 10
.
的情况下如何产生 None
仅从 asInstanceOf
-codesmell 来看,应该很明显它不能那样工作。您必须将过滤步骤移至 for
-表达式的生成器部分:
for{
i1 <- opt1
i2 <- opt2
if (i1 + i2 <= 10)
} yield i1 + i2
注意在for
-comprehension中,(i1 + i2 <= 10)
中的括号可以省略
我正在尝试理解并编写了以下代码:
object Main extends App {
val resultOption: Option[Int] =
for{
i1 <- opt1
i2 <- opt2
} yield {
if(i1 + i2 > 10) null.asInstanceOf[Int]
else i1 + i2
}
println(resultOption) // <---- Here
def opt1: Option[Int] = //some computations
def opt2: Option[Int] = //some computations
}
我希望 resultOption
成为 None
以防满足条件,但返回 Some(0)
。我查看了 yield 块的编译代码,我们这里有:
Code:
0: aload_0
1: getfield #25 // Field i1:I
4: iload_1
5: iadd
6: bipush 10
8: if_icmple 18
11: aconst_null
12: invokestatic #31 // Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
15: goto 24
18: aload_0
19: getfield #25 // Field i1:I
22: iload_1
23: iadd
24: ireturn
在 12:
我们调用 BoxesRunTime.unboxToInt(null)
确实 returns 0
。问题是在 i1 + i2 > 10
.
None
仅从 asInstanceOf
-codesmell 来看,应该很明显它不能那样工作。您必须将过滤步骤移至 for
-表达式的生成器部分:
for{
i1 <- opt1
i2 <- opt2
if (i1 + i2 <= 10)
} yield i1 + i2
注意在for
-comprehension中,(i1 + i2 <= 10)
中的括号可以省略