2013-06-03 2 views
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 
    } 
} 

ответ

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. В сопоставлении с образцом вы просто сопоставляетесь с типом или другими вещами

+0

Спасибо, что очищает его! – tsjnsn

6

Вместо вашего denull метода вы должны использовать Option.apply. Он делает то же самое. Возможные значения null всегда должны обрабатываться явно! Неявное преобразование опасно и может смущать других людей, которые должны работать с вашим кодом. Как это так:

Option(x) match {} 

или в большинстве случаев даже лучше:

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

Я никогда не планировал использовать это для любого производственного кода, просто для изучения понятий, но спасибо за совет – tsjnsn

Смежные вопросы