Mengapa Scala menggunakan operator '_' untuk impor paket alih-alih '*' seperti di Jawa?


17

Menurut pendapat saya, salah satu hal terbesar tentang Scala adalah interoperabilitasnya dengan Java dan sintaksisnya yang serupa. Satu hal yang saya temukan aneh adalah penggunaan _operator untuk paket impor kartu wil bukan *operator yang digunakan di Jawa.

Apakah ada alasan teknis untuk menggunakan _bukan *? Jika tidak, lalu mengapa perubahan ini dilakukan?


Ini mungkin saja hal yang fungsional. Saya tahu Haskell menggunakan _ di beberapa tempat untuk bertindak sebagai wildcard / nilai yang tidak ditentukan.
KChaloux

Jawaban:


36

Di Scala, itu *adalah pengidentifikasi yang valid. Orang bisa menulis:

val * = "trollin'"
println(*)

Hasilnya adalah:

trollin'

Seseorang dapat menulis kelas dengan nama *seperti itu:

class * {
  def test():String = {
    "trollin'"
  }
}

Jadi dengan demikian, ketika saya memiliki kelas *dalam paket us.hexcoderdan saya menulis:

import us.hexcoder.*

Anda akan mengatakan bahwa Anda ingin mengimpor kelas dengan nama *. Karena itu, Scala perlu menggunakan simbol lain untuk menunjukkan impor wildcard. Untuk alasan apa pun, mereka memutuskan untuk menggunakan _sebagai simbol wildcard.


9
Pertanyaannya kemudian, mengapa * dipilih sebagai pengidentifikasi yang valid dan _ sebagai wildcard?
Mike Partridge

2
Meskipun saya memiliki lebih banyak upvotes, ini adalah jawaban yang lebih benar. Belum pernah mendengar * sebagai pengenal sebelumnya.
Michael Brown

1
@ MikeBrown Ini juga berlaku di Lisp. Berikut adalah contoh dalam Skema

18
@ MikePatridge Hampir pasti karena Scala mendefinisikan semua operatornya sebagai fungsi, dan memungkinkan pengembang untuk mendefinisikan operator mereka sendiri. Itu tidak melakukan sintaks kasus khusus untuk operator, dan *perlu dimasukkan untuk perkalian. Jadi karakter lain yang kurang umum perlu dipilih sebagai karakter pendiam.
KChaloux

3
Karakter _ menyerupai blank (seperti pada "fill in the blank"), jadi apakah Scala meminjamnya dari tempat lain atau membuatnya sendiri, masuk akal untuk menggunakannya sebagai wildcard.
Michael Shaw

13

Dalam bahasa fungsional, karakter _ biasanya digunakan untuk mengatakan, "Saya tidak peduli dengan parameter ini" atau "apa pun bisa masuk ke sini". Memperluas nilai itu ke impor namespace hanya masuk akal.


2

Selain jawaban Glenn, importadalah pernyataan yang valid di mana saja di Scala dan Anda dapat importobjek atau instance anggota ke dalam ruang lingkup. Karena *jelas merupakan anggota dari banyak kelas, itu tidak dapat digunakan sebagai wildcard untuk importpernyataan tersebut. Jadi Anda berakhir dengan string yang tidak boleh menjadi pengidentifikasi yang valid.

_datang ke pikiran. Fakta bahwa itu digunakan di tempat lain untuk makna yang berbeda (tipe eksistensial, berfungsi sebagai contoh) juga karena masalah yang sama.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.