2017-01-03 67 views
1

我試圖重現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不爲空,但失敗了mystring時爲空,則返回:

error: value ?? is not a member of Null 
val value = myString ?? "myString is null" 

我明白錯誤,但是有沒有辦法在Scala中實現這一點,或者它是不可能的?

感謝

+0

Scala鼓勵您不要在代碼中使用null。這就是你應該努力去做的。 –

+0

我知道在Scala代碼中使用null是一個不好的做法,但是可以通過庫方法調用返回null值,並且您必須處理它。 – reevolt

+0

你說得對。實際要做的事通常是在最低級別處理來自第三方庫的'null'值,然後傳播'Option [T]'或其他空值避免值。 –

回答

5

1日建議:你應該嘗試寫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,這是不好的斯卡拉。一旦編譯器不知道您的val是什麼類型,那麼您將從類型系統的全面支持中解脫出來。

+0

感謝您的回答。我喜歡使用的C#語法涉及到一些Scala糟糕的做法...... – reevolt

+0

如果使用通用類型對隱式類進行參數化,它將阻止使用「Any」和類型混合。 – puhlen

+0

@puhlen,如果我們有'class ShortCond [A]'和'def ?? [B]',那麼返回類型仍然是A和B的最低上界(LUB),這很可能是' Any'。真正的解決辦法是返回'或者[A,B]',但這不是OP要找的。 – jwvh