Załóżmy, że mam metodę, session.get(str: String): String
ale nie wiesz, czy zwróci ci ona ciąg znaków, czy wartość null, ponieważ pochodzi z Javy.
Czy jest łatwiejszy sposób na rozwiązanie tego problemu w Scali zamiast session.get("foo") == null
? Może jakaś magia się zastosuje, ToOption(session.get("foo"))
a potem będę mógł to traktować w sposób Scala
ToOption(session.get("foo")) match {
case Some(_) =>;
case None =>;
}
java
scala
scala-option
José Leal
źródło
źródło
Odpowiedzi:
Metoda
Option
obiektu towarzyszącegoapply
służy jako funkcja konwersji z odwołań dopuszczających wartość null:źródło
Option
Obiekt maapply
metody, która robi dokładnie to:źródło
Zauważ, że podczas pracy z obiektami Java nie będzie działać zgodnie z oczekiwaniami:
źródło
To bardzo stary temat, ale fajny!
Prawdą jest, że przekształcenie dowolnego wyniku trybu Non-wyjątek w Try na Option spowoduje, że ...
... ponieważ w Try nie chodzi o sprawdzanie wartości null, ale tylko o sposób na funkcjonalną obsługę wyjątków.
Użycie opcji Spróbuj przechwycić wyjątek i przekonwertowanie go na opcję dla wygody spowoduje wyświetlenie Brak tylko w przypadku wystąpienia wyjątku.
Chcesz zachować wartości wynikające z Try. To może być nieważne.
Ale prawdą jest również, że standardowa biblioteka czasami jest dość myląca ...
To zachowanie jest nieco niespójne, ale w pewnym sensie odzwierciedla zamierzone użycie zarówno Try, jak i Option.
Używasz try, aby uzyskać wszystko, co pochodzi z wyrażenia, które może rzucać wyjątki, i nie przejmujesz się samym wyjątkiem.
Wartość, która może się pojawić, może być zerowa. Jeśli toOption dało None, nie możesz odróżnić wyjątku od wartości null , a to nie jest ładne!
Samodzielnie, używasz Option, aby hermetyzować istnienie czegoś lub nie. Więc w tym przypadku Some (null) to None, i to ma sens, ponieważ null w tym przypadku oznacza brak czegoś. Nie ma tu dwuznaczności.
Należy zauważyć, że w żadnym przypadku przezroczystość referencyjna nie jest zepsuta, ponieważ .toOption to nie to samo, co Option ()
Jeśli naprawdę potrzebujesz wymusić ZARÓWNO bezpieczeństwo wyjątków ORAZ bezpieczeństwo zerowe, a Twój kod naprawdę nie musi rozróżniać między wartością zerową a wyjątkiem , wystarczy połączyć oba paradygmaty! Ponieważ cóż, tego właśnie chcesz, prawda?
Możesz to zrobić w jeden sposób ...
... lub inny ...
... lub śmiesznie brzydkie z nich inne ...
źródło