Misalkan saya memiliki metode session.get(str: String): String
tetapi Anda tidak tahu apakah itu akan mengembalikan Anda string atau null, karena berasal dari Java.
Apakah ada cara yang lebih mudah untuk menangani ini di Scala daripada session.get("foo") == null
? Mungkin beberapa sihir berlaku seperti ToOption(session.get("foo"))
dan kemudian saya bisa memperlakukannya seperti Scala
ToOption(session.get("foo")) match {
case Some(_) =>;
case None =>;
}
java
scala
scala-option
José Leal
sumber
sumber
Jawaban:
Metode
Option
objek pendampingapply
berfungsi sebagai fungsi konversi dari referensi nullable:sumber
The
Option
objek memilikiapply
metode yang tidak tepat:sumber
Perhatikan bahwa saat bekerja dengan objek Java itu tidak akan berfungsi seperti yang diharapkan:
sumber
Ini adalah topik yang sangat lama tapi bagus!
Memang benar bahwa mengubah hasil Non-pengecualian dari Try to Option akan menghasilkan Beberapa ...
... karena Try bukan tentang pemeriksaan nullability tetapi hanya cara untuk menangani pengecualian secara fungsional.
Menggunakan Coba untuk menangkap pengecualian dan mengubahnya menjadi Opsi untuk kenyamanan hanya akan menampilkan Tidak Ada jika terjadi pengecualian.
Anda ingin melestarikan nilai-nilai yang keluar dari Try. Itu mungkin nol.
Tetapi juga benar bahwa lib standar terkadang cukup membingungkan ...
Perilaku ini agak tidak konsisten tetapi ini mencerminkan penggunaan yang diinginkan dari Try dan Option.
Anda menggunakan mencoba untuk mendapatkan apa pun yang keluar dari ekspresi yang mungkin memunculkan pengecualian, dan Anda tidak peduli dengan pengecualian itu sendiri.
Nilai yang mungkin keluar mungkin saja nol. Jika toOption memberikan Tidak ada, Anda tidak dapat membedakan antara pengecualian dan nol , dan itu tidak cantik!
Mandiri, Anda menggunakan Option untuk merangkum ada atau tidaknya sesuatu. Jadi dalam kasus itu Some (null) is None, dan itu masuk akal, karena null dalam kasus itu mewakili tidak adanya sesuatu. Tidak ada ambiguitas di sini.
Penting untuk diperhatikan bahwa dalam hal apapun transparansi referensial tidak rusak karena .toOption tidak sama dengan Option ()
Jika Anda benar-benar perlu menegakkan KEDUA keamanan pengecualian DAN keamanan nol, dan kode Anda benar-benar tidak perlu membedakan antara nol dan pengecualian , Anda hanya perlu menggabungkan kedua paradigma! Karena yah, itu yang kamu inginkan, bukan?
Anda dapat melakukannya dengan satu cara ...
... atau lainnya ...
... atau yang paling jelek dari mereka yang lain ...
sumber