1

有没有办法在 x 匹配之前调用这个隐式方法以满足匹配的类型要求?

如果我直接调用它,它会按预期工作,但我想知道是否可以推断调用。

object ImplicitTest extends App {
  implicit def denull[T<:Any](mightBeNull:T):Option[T] = {
    if (mightBeNull == null) None
    else Some(canBeNull)
  }

  var x:String = null
  x match {  //works if i do "denull(x) match {"
    case Some(str:String) =>
      println(str)
    case None => None
  }
}
4

2 回答 2

6

而不是你的denull方法,你应该使用Option.apply. 它做同样的事情。应该始终明确处理可能的空值!隐式转换很危险,可能会让其他必须使用您的代码的人感到困惑。像这样做:

Option(x) match {}

或者在大多数情况下甚至更好:

Option(x).fold { ... } { ... }
于 2013-06-03T20:10:27.497 回答
1

如果需要,您可以使用使用隐式转换的方法包装它:

def print[A](opt: Option[A]) = opt.foreach(println)

当您在具有 null 值的变量上调用此方法时,Scala 编译器会解析您的隐式转换方法denull,如果不是None,将打印它。但是你可以简单地做到这一点没有denull方法:

var str: String = null
Option(str).foreach(println)

Scala 不会解决模式匹配中的隐式转换,因为不知道它需要转换为其他类型。这种转换方式是一种防止类型错误的机制,当编译器可以执行“最后一次尝试”并在需要类型A的地方使用一些带有类型的值时B。在模式匹配中,您只需匹配类型或其他内容

于 2013-06-03T20:11:17.233 回答