为什么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的成员,所以在编译时根本没有触发