Предположим, у меня есть метод, session.get(str: String): String
но вы не знаете, вернет ли он вам строку или ноль, потому что он исходит из Java.
Есть ли более простой способ решить эту проблему в Scala вместо session.get("foo") == null
? Может быть, применима какая-то магия, ToOption(session.get("foo"))
и тогда я могу рассматривать ее в Scala как
ToOption(session.get("foo")) match {
case Some(_) =>;
case None =>;
}
java
scala
scala-option
Хосе Леаль
источник
источник
Ответы:
Метод
Option
сопутствующего объектаapply
служит функцией преобразования из ссылок, допускающих значение NULL:источник
У
Option
объекта естьapply
метод, который делает именно это:источник
Обратите внимание, что при работе с объектами Java это не работает должным образом:
источник
Это очень старая тема, но хорошая!
Это правда, что преобразование любого результата попытки без исключения в вариант приведет к некоторому ...
... потому что Try - это не проверка допустимости значений NULL, а просто способ функциональной обработки исключений.
Использование Try для перехвата исключения и преобразование его в Option для удобства покажет None только в случае возникновения исключения.
Вы хотите сохранить ценности, полученные с помощью Try. Это может быть пустым.
Но верно также и то, что стандартная библиотека иногда довольно сбивает с толку ...
Такое поведение немного непоследовательно, но отчасти отражает намеренное использование как Try, так и Option.
Вы используете try, чтобы получить все, что выходит из выражения, которое может вызывать исключения, и вас не волнует само исключение.
Значение, которое может получиться, вполне может быть нулевым. Если toOption предоставил None, вы не сможете отличить исключение от нуля , и это некрасиво!
В автономном режиме вы используете Option, чтобы инкапсулировать существование чего-либо. Итак, в этом случае Some (null) равен None, и это имеет смысл, потому что null в этом случае представляет собой отсутствие чего-либо. Здесь нет двусмысленности.
Важно отметить, что в любом случае ссылочная прозрачность не нарушается, поскольку .toOption не то же самое, что Option ()
Если вам действительно необходимо для обеспечения ОБА безопасности исключения и нулевой безопасности, и ваш код действительно действительно не нужен differenciate между нулем и исключением , вам просто нужно объединить обе парадигмы! Потому что это то, чего ты хочешь, правда?
Вы можете сделать это одним способом ...
... или другой ...
... или до смехотворно уродливого из них другие ...
источник