2017-01-03 4 views
1

Ich versuche, eine C# Syntax in Scala zu reproduzieren:Implizite Konvertierung auf Null Typ

Der C# -Code:

val myValue = myObject ?? new MyClass(); 

im Grunde 'myValue Willen enthält 'myObject', wenn es nicht null ist, oder eine neue Instanz von 'MyClass', wenn sie null ist.

Dies ist die Scala-Code, den ich zu laufen versucht:

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" 

Es funktioniert, wenn myString nicht null ist, aber nicht, wenn myString null ist, gibt sie:

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

ich das verstehen Fehler, aber gibt es einen Weg, dies in Scala zu erreichen oder ist es nicht möglich?

Dank

+0

Scala ermutigt Sie, "Null" in Ihrem Code überhaupt nicht zu verwenden. Das sollten Sie anstreben. –

+0

Ich weiß, dass es eine schlechte Methode ist, null in Scala-Code zu verwenden, aber der Null-Wert kann durch einen Aufruf einer Bibliotheksmethode zurückgegeben werden, und Sie müssen damit umgehen. – reevolt

+0

Sie haben Recht. Die eigentliche Sache zu tun ist in der Regel kümmern sich um die 'Null'-Werte von 3rd-Party-Bibliotheken auf der niedrigsten Ebene, die Sie können, und dann propagieren' Option [T] 'oder andere null zu vermeiden Werte. –

Antwort

5

1. Vorschlag: Sie sollten versuchen, zu Scala Idiome zu bleiben, wenn Scala Code zu schreiben. Die Scala Weg, dies zu tun, etwas sein könnte, wie ...

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 

Aber das ist eine schlechte Idee für eine Reihe von Gründen, vor allem Sie versuchen Mischtypen zurück, was bedeutet, dass der Compiler es beschließt, Geben Sie Any, die nicht gut ist Scala. Sobald der Compiler nicht weiß, welcher Typ val ist, entfernen Sie sich von der vollen Unterstützung des Typsystems.

+0

Danke für deine Antwort. Die C# -Syntax, die ich zu schätzen weiß, beinhaltet einige schlechte Scala-Praktiken ... – reevolt

+0

Wenn Sie die implizite Klasse mit einem generischen Typ parametrisieren, wird die Verwendung von 'Any' verhindert und Typ-Mixing. – puhlen

+0

@puhlen, wenn wir 'Klasse ShortCond [A]' und 'def ?? [B]' haben, dann wird der Rückgabetyp immer noch die niedrigste obere Grenze (LUB) für A und B sein, die wahrscheinlich 'ist Irgendein'. Die wirkliche Lösung ist die Rückgabe von "Entweder [A, B]", aber das ist nicht das, wonach der OP sucht. – jwvh

Verwandte Themen