Pertanyaan Penggunaan Null / Nothing / Unit di Scala


Saya baru saja membaca: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/

Sejauh yang saya mengerti, Null adalah sifat dan contohnya adalah null.

Ketika suatu metode mengambil argumen Null, maka kita hanya bisa melewatkannya a Null referensi atau null langsung, tetapi tidak ada referensi lain, bahkan jika itu tidak valid (nullString: String = null sebagai contoh).

Saya hanya ingin tahu di mana kasus menggunakan ini Null sifat bisa berguna. Ada juga sifat Tidak ada yang saya tidak benar-benar melihat contoh lainnya.


Saya benar-benar tidak mengerti apa perbedaan antara menggunakan Tidak Ada dan Unit sebagai jenis kembali, karena keduanya tidak mengembalikan hasil apa pun, bagaimana mengetahui mana yang akan digunakan ketika saya memiliki metode yang melakukan pencatatan log misalnya?


Apakah Anda memiliki penggunaan Unit / Null / Tidak ada yang lain selain tipe kembalinya?


76
2018-04-23 15:34


asal


Jawaban:


Anda hanya menggunakan Tidak ada jika metode tidak pernah kembali (berarti tidak dapat menyelesaikan secara normal dengan kembali, itu bisa melempar pengecualian). Tidak ada yang tidak pernah dipakai dan ada untuk kepentingan sistem tipe (mengutip James Iry: "Alasan Scala memiliki tipe bawah terikat pada kemampuannya untuk mengekspresikan varians dalam parameter jenis."). Dari artikel yang Anda tautkan:

Satu lagi penggunaan Tidak ada adalah sebagai jenis pengembalian untuk metode yang tidak pernah ada   kembali. Masuk akal jika Anda memikirkannya. Jika metode kembali   ketik Tidak ada, dan sama sekali tidak ada contoh Tidak ada,   maka metode semacam itu tidak boleh kembali.

Metode pencatatan Anda akan mengembalikan Unit. Ada Unit nilai sehingga sebenarnya bisa dikembalikan. Dari Dokumen API:

Satuan adalah subtipe dari scala.AnyVal. Hanya ada satu nilai tipe   Unit, (), dan itu tidak diwakili oleh objek apa pun yang mendasarinya   sistem runtime. Metode dengan Unit jenis pengembalian analog dengan Java   metode yang dinyatakan batal.


65
2018-04-23 15:40



Artikel yang Anda kutip bisa menyesatkan. Itu Null ketik ada untuk kompatibilitas dengan Mesin virtual Java, dan Java khususnya.

Kita harus mempertimbangkan itu Scala:

  • benar-benar berorientasi pada objek: setiap nilai adalah objek
  • sangat diketik: setiap nilai harus memiliki tipe
  • perlu ditangani null referensi untuk mengakses, misalnya, pustaka dan kode Java

sehingga menjadi perlu untuk menentukan jenis untuk null nilai, yang merupakan Null sifat, dan telah null sebagai contohnya saja.

Tidak ada yang sangat berguna dalam Null ketik kecuali Anda adalah tipe-sistem atau Anda sedang mengembangkan di compiler. Secara khusus saya tidak bisa melihat alasan yang masuk akal untuk mendefinisikan Null ketikkan parameter untuk suatu metode, karena Anda tidak dapat melewatkan apa pun kecuali null


16
2018-04-23 16:40



Apakah Anda memiliki penggunaan Unit / Null / Tidak ada yang lain selain   jenis kembali?


Unit dapat digunakan seperti ini:

def execute(code: => Unit):Unit = {
  // do something before
  code
  // do something after
}

Ini memungkinkan Anda untuk melewati blok kode yang acak untuk dieksekusi.


Null dapat digunakan sebagai tipe bawah untuk nilai apa pun yang dapat dibatalkan. Contohnya adalah ini:

implicit def zeroNull[B >: Null] =
    new Zero[B] { def apply = null }

Nothingdigunakan dalam definisi None

object None extends Option[Nothing]

Ini memungkinkan Anda untuk menetapkan None untuk semua jenis Option karena Nothing 'meluas' segalanya.

val x:Option[String] = None

14
2018-04-23 16:40



Saya tidak pernah benar-benar menggunakan Null ketik, tetapi Anda gunakan Unit, di mana Anda akan menggunakan java void. Nothing adalah tipe khusus, karena seperti yang telah disebutkan Nathan, tidak akan ada contoh Nothing. Nothing adalah tipe bawah yang disebut, yang berarti, bahwa itu adalah sub-tipe dari jenis lainnya. Ini (dan parameter tipe contravariant) adalah mengapa Anda dapat menambahkan nilai apa pun Nil - yang mana List[Nothing] - dan daftar kemudian akan menjadi tipe elemen ini. None juga jika tipe Option[Nothing]. Setiap upaya untuk mengakses nilai-nilai di dalam wadah tersebut akan memberikan pengecualian, karena itu satu-satunya cara yang sah untuk kembali dari metode tipe Nothing.


5
2018-04-23 15:50



jika kamu gunakan Nothing, tidak ada hal yang harus dilakukan (termasuk konsol cetak) jika Anda melakukan sesuatu, gunakan jenis keluaran Unit

object Run extends App {
  //def sayHello(): Nothing = println("hello?")
  def sayHello(): Unit = println("hello?")
  sayHello()
}

... lalu bagaimana cara menggunakannya Nothing?

trait Option[E]
case class Some[E](value: E) extends Option[E]
case object None extends Option[Nothing]

5
2018-04-07 04:35



Tidak ada sering digunakan secara implisit. Dalam kode di bawah ini,      val b: Boolean = if (1 > 2) false else throw new RuntimeException("error") itu lain klausa adalah tipe Tidak ada, yang merupakan subkelas dari Boolean (serta AnyVal lainnya). Dengan demikian, seluruh penugasan berlaku untuk compiler, meskipun lain klausul tidak benar-benar mengembalikan apa pun.


2
2018-06-29 23:34



Berikut ini contohnya Nothing dari scala.predef:

  def ??? : Nothing = throw new NotImplementedError

Jika Anda tidak terbiasa (dan mesin telusur tidak dapat menelusurinya) ??? adalah fungsi placeholder Scala untuk apa pun yang belum diimplementasikan. Sama seperti Kotlin TODO.

Anda dapat menggunakan trik yang sama saat membuat objek tiruan: mengganti metode yang tidak digunakan dengan custom notUsed metode. Keuntungan dari tidak menggunakan ??? adalah bahwa Anda tidak akan mendapatkan peringatan kompilasi untuk hal-hal yang tidak pernah Anda terapkan.


0
2018-06-06 22:09