Как уступить None в понимании, если какое-то условие соответствует - PullRequest
0 голосов
/ 12 июня 2018

Я экспериментирую для понимания и написал следующий код:

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

Я хотел, чтобы 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 Ответ

0 голосов
/ 12 июня 2018

Только из asInstanceOf -кодирования должно быть очевидно, что он не работает таким образом.Вы должны переместить этап фильтрации в часть генератора for -выражения:

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

Обратите внимание, что внутри for -разрешения скобки в (i1 + i2 <= 10) могут быть опущены.

...