gpt4 book ai didi

scala - 对 Option 的理解的 Scala 解释

转载 作者:行者123 更新时间:2023-12-04 18:29:09 28 4
gpt4 key购买 nike

我有以下定义:

def f: Option[String] = Some(null)

以下评估为无:
for {x:String <- f} yield {
x
}

以下计算为 Some(null):
for {x <- f} yield {
x
}

以下计算为 Some(null):
f.map((x:String) => x)

我想知道为什么它们之间存在差异?

最佳答案

脱糖发生在解析器中,所以 -Xprint:parser显示差异:

$ scala -Xprint:parser
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111).
Type in expressions for evaluation. Or try :help.

scala> for (s: String <- (Some(null): Option[String])) yield s
[[syntax trees at end of parser]] // <console>
package $line3 {
object $read extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
object $iw extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
object $iw extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
val res0 = (Some(null): Option[String]).withFilter(((check$ifrefutable$1) => check$ifrefutable$1: @scala.unchecked match {
case (s @ (_: String)) => true
case _ => false
})).map(((s: String) => s))
}
}
}
}

res0: Option[String] = None

这让我感到惊讶,因为我认为以这种方式过滤是人们想要但没有实现的功能。

类型模式只是一个 instanceof 测试,因此 null 未能通过该测试。

没有过滤器:
scala> for (s <- (Some(null): Option[String])) yield s
[[syntax trees at end of parser]] // <console>
package $line4 {
object $read extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
object $iw extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
object $iw extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
val res1 = (Some(null): Option[String]).map(((s) => s))
}
}
}
}

res1: Option[String] = Some(null)

在 2.9 中:
$ scala29
Welcome to Scala version 2.9.3 (OpenJDK 64-Bit Server VM, Java 1.6.0_38).
Type in expressions to have them evaluated.
Type :help for more information.

scala> for (s: String <- (Some(null): Option[String])) yield s
res0: Option[String] = Some(null)

所以过滤功能是在 2.10.x 中添加的。

编辑:实际上, this是你没有得到的:
scala> for (s: String <- (Some("x"): Option[Any])) yield s
<console>:12: error: type mismatch;
found : String => String
required: Any => ?
for (s: String <- (Some("x"): Option[Any])) yield s
^

关于scala - 对 Option 的理解的 Scala 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41499441/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com