Как уступить None в понимании, если какое-то условие соответствует
Я экспериментирую для понимания и написал следующий код:
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$1: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$1:I
22: iload_1
23: iadd
24: ireturn
В 12:
мы называем BoxesRunTime.unboxToInt(null)
который действительно возвращается 0
, Вопрос в том, как уступить None
в случае i1 + i2 > 10
,
1 ответ
Решение
От asInstanceOf
- Только по одному, должно быть очевидно, что это не так. Вы должны переместить шаг фильтрации в генераторную часть for
-expression:
for{
i1 <- opt1
i2 <- opt2
if (i1 + i2 <= 10)
} yield i1 + i2
Обратите внимание, что внутри for
-понимание, скобки в (i1 + i2 <= 10)
может быть опущен