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?

vainolo
sumber
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.


sumber
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.

Michael Brown
sumber
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.

Leo
sumber
0

Di Scala ada puluhan tempat di mana garis bawah digunakan. Menggunakannya untuk impor wildcard hanyalah konsekuensi logis.

kiritsuku
sumber