有没有办法隐含地完成这项工作?

时间:2013-06-03 20:00:52

标签: scala type-inference implicit

有没有办法让这个隐式方法在匹配前调用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
  }
}

2 个答案:

答案 0 :(得分:6)

您应使用denull代替Option.apply方法。它做同样的事情。应始终明确处理可能的空值!隐式转换很危险,对于必须使用代码的其他人来说可能会造成混淆。这样做:

Option(x) match {}

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

Option(x).fold { ... } { ... }

答案 1 :(得分:1)

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

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

当您对具有空值的变量调用此方法时,Scala编译器会解析您的隐式转换方法denull,如果它不是None,则会打印它。 但您可以在没有denull方法的情况下执行此操作:

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

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