2017-01-03 4 views
1

Я пытаюсь воспроизвести C# синтаксис в Scala:неявное преобразование от типа Null

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 имеет нулевое значение, она возвращает:

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

Я понимаю, ошибка, но есть ли способ достичь этого в Scala или это невозможно?

Благодаря

+0

Scala рекомендует вам не использовать «null» в вашем коде вообще. Это то, к чему вы должны стремиться. –

+0

Я знаю, что это неправильная практика использования null в коде Scala, но нулевое значение может быть возвращено с помощью вызова метода библиотеки, и вам придется иметь дело с ним. – reevolt

+0

Ты прав. Фактическая задача - обычно следить за значениями «null» из сторонних библиотек на самом нижнем уровне, а затем распространять «Option [T]» или другие значения, исключающие null. –

ответ

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 

Но это плохая идея, по ряду причин, в основном вы пытаетесь вернуть смешанные типы, что означает, что компилятор разрешает его type Any, который не очень хороший Scala. Как только компилятор не знает, какой тип вашего val, вы удаляете себя из полной поддержки системы типов.

+0

Спасибо за ваш ответ. Синтаксис C#, который я ценю для использования, включает в себя некоторые неудачные практики Scala ... – reevolt

+0

Если вы параметризуете неявный класс общим типом, это предотвратит использование 'Any' и тип смешивания. – puhlen

+0

@puhlen, если у нас есть 'class ShortCond [A]' и 'def ?? [B]', тогда тип возврата по-прежнему будет самой низкой верхней границей (LUB) для A и B, которая, вероятно, будет ' Any'. Реальное решение - вернуть «Либо [A, B]», но это не то, что ищет OP. – jwvh

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