我试图在Scala中重现C#语法:
C#代码:
val myValue = myObject ?? new MyClass();
基本上' myValue'将包含' myObject'如果它不为空,或者是一个新的' MyClass'如果它为空。
这是我试图运行的Scala代码:
case class ShortCond(original: Any){
def ??(fallback : Any) {
if (original == null)
return fallback
return original
}
}
implicit def any2ShortCond(original: Any) = ShortCond(original)
val myString = null
val value = myString ?? "myString is null"
当myString不为null时它起作用,但当myString为null时失败,它返回:
error: value ?? is not a member of Null
val value = myString ?? "myString is null"
我理解错误,但有没有办法在Scala中实现这一点,或者这是不可能的?
由于
答案 0 :(得分:5)
第一个建议:在编写Scala代码时,您应该尝试坚持使用Scala习语。 Scala的方法可能就像......
implicit class ShortCond(original: Any){
def ??(fallback : Any) =
Option(original).getOrElse(fallback)
}
val str:String = null
str ?? 34 // res0: Any = 34
"x" ?? 43 // res1: Any = x
但出于多种原因这是一个坏主意,主要是你尝试返回混合类型,这意味着编译器将其解析为Any
类型,这不是好Scala。一旦编译器不知道您的val
是什么类型,那么您将从类型系统的完全支持中移除自己。