如果某些条件满足,如何在for-understanding中产生None

时间:2018-06-12 15:01:26

标签: scala for-comprehension scala-option

我正在尝试理解并编写以下代码:

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
}

IDEONE working example

如果符合条件,我希望resultOptionNone,但返回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 个答案:

答案 0 :(得分:5)

仅从asInstanceOf - 代码中就可以看出它不会那样工作。您必须将过滤步骤移动到for - 表达式的生成器部分:

for{
    i1 <- opt1
    i2 <- opt2
    if (i1 + i2 <= 10)
} yield i1 + i2

请注意,在for - 理解中,(i1 + i2 <= 10)中的括号可以省略。