为什么Scala在None.map(u.trim)中启动trim函数?

为什么Scala在None.map(u.trim)中启动trim函数?,scala,Scala,我有一行这样的代码: Option(str).map(_.trim).getOrElse("") 想法很简单:修剪输入字符串,如果没有,则返回空白字符串 但是当str为null时,它在scala控制台中失败:错误:value trim不是null的成员 原因很明显,因为scala会触发map()中的函数,即使对象是None。但是它不是应该直接返回None吗?在2.9.1中,它适用于我: scala> val x : Option[String] = Option(null) x: Opt

我有一行这样的代码:

Option(str).map(_.trim).getOrElse("")
想法很简单:修剪输入字符串,如果没有,则返回空白字符串

但是当str为null时,它在scala控制台中失败:错误:value trim不是null的成员


原因很明显,因为scala会触发
map()
中的函数,即使对象是
None
。但是它不是应该直接返回
None
吗?

在2.9.1中,它适用于我:

scala> val x : Option[String] = Option(null)
x: Option[String] = None

scala> x.map{_.length}
res4: Option[Int] = None
不工作,因为类型是
选项[Null]
而不是
选项[String]

scala> Option(null).map(_.trim)
<console>:8: error: value trim is not a member of Null
              Option(null).map(_.trim)

在2.9.1中,它适用于我:

scala> val x : Option[String] = Option(null)
x: Option[String] = None

scala> x.map{_.length}
res4: Option[Int] = None
不工作,因为类型是
选项[Null]
而不是
选项[String]

scala> Option(null).map(_.trim)
<console>:8: error: value trim is not a member of Null
              Option(null).map(_.trim)

接得好!如果他没有给出显式类型,Scala将推断
Null
的类型
Null
。这也应该起作用:
选项(null:String).map(u.trim)
有趣!虽然选项(null:null)似乎没有返回任何值,但它仍然像一些(null)?您没有看到运行时错误。它从类型中知道不能在null上调用
trim
。所以它真的只是没有通过类型检查。@Larsenal啊。这很有道理。谢谢,接得好!如果他没有给出显式类型,Scala将推断
Null
的类型
Null
。这也应该起作用:
选项(null:String).map(u.trim)
有趣!虽然选项(null:null)似乎没有返回任何值,但它仍然像一些(null)?您没有看到运行时错误。它从类型中知道不能在null上调用
trim
。所以它真的只是没有通过类型检查。@Larsenal啊。这很有道理。谢谢。请看下面@Larsenal的答案。问题不是
trim
实际上被调用,而是编译器在类型检查期间失败,因为
Null
类没有
trim
方法。@NSF错误,如error:value trim不是Null的成员,所以在编译时根本没有触发(但)请参见下面的@Larsenal答案。问题不在于实际调用了
trim
,而是编译器在类型检查过程中失败,因为
Null
类没有
trim
方法。@NSF错误,如error:value trim不是Null的成员,所以在编译时根本没有触发