Dlaczego Scala używa operatora „_” do importowania pakietu zamiast „*” jak w Javie?

17

Moim zdaniem jedną z największych zalet Scali jest jej interoperacyjność z Javą i jej podobna składnia. Jedną z rzeczy, które uznałem za dziwne, jest użycie _operatora do importowania pakietów wilcard zamiast *operatora używanego w Javie.

Czy istnieje techniczny powód, aby używać _zamiast *? Jeśli nie, to dlaczego dokonano tej zmiany?

vainolo
źródło
To może być po prostu funkcjonalna rzecz. Wiem, że Haskell używa _ w kilku miejscach, aby działać jako symbol wieloznaczny / wartość nieokreślona.
KChaloux,

Odpowiedzi:

36

W Scali *jest to poprawny identyfikator. Można napisać:

val * = "trollin'"
println(*)

W wyniku czego:

trollin'

Można napisać klasę o *takiej nazwie :

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

Tak jest w tym przypadku, gdy mam klasę *w pakiecie us.hexcoderi piszę:

import us.hexcoder.*

Powiedziałbyś, że chcesz zaimportować klasę o nazwie *. Z tego powodu Scala musiał użyć innego symbolu, aby wskazać import znaku wieloznacznego. Z jakiegokolwiek powodu postanowili użyć _jako symbolu wieloznacznego.


źródło
9
Powstaje zatem pytanie, dlaczego * został wybrany jako prawidłowy identyfikator, a _ jako symbol wieloznaczny?
Mike Partridge
2
Mimo że mam więcej głosów pozytywnych, jest to bardziej poprawna odpowiedź. Nigdy wcześniej nie słyszałem o * jako identyfikatorze.
Michael Brown
1
@MikeBrown Obowiązuje również w Lisp. Oto przykład na schemacie
18
@MikePatridge Niemal na pewno dlatego, że Scala definiuje wszystkich swoich operatorów jako funkcje i pozwala deweloperowi definiować własnych operatorów jako takich. Nie wykonuje specjalnej składni dla operatorów i *musiał zostać uwzględniony przy mnożeniu. Tak więc inna, mniej popularna postać musiała zostać wybrana jako postać zarezerwowana.
KChaloux 11.04.13
3
Znak _ przypomina puste miejsce (jak w „wypełnij puste miejsce”), więc niezależnie od tego, czy Scala pożyczył je gdzieś indziej, czy też sam je wymyślił, warto użyć go jako symbolu wieloznacznego.
Michael Shaw,
13

W językach funkcjonalnych znak _ jest powszechnie używany do powiedzenia „nie dbam o ten parametr” lub „wszystko może się tu udać”. Rozszerzenie tej wartości na import przestrzeni nazw ma sens.

Michael Brown
źródło
2

Oprócz odpowiedzi Glenna, importjest to prawidłowe oświadczenie w dowolnym miejscu w Scali i można importobjąć zakresem obiekt lub instancję. Ponieważ *jest on oczywiście członkiem wielu klas, nie można go używać jako symbolu wieloznacznego dla importinstrukcji. W rezultacie otrzymujesz ciąg znaków, który nie może być prawidłowym identyfikatorem.

_przychodzi na myśl. Fakt, że jest on używany w innych miejscach dla innego znaczenia (typ egzystencjalny, funkcja jako instancja) również wynika z tego samego problemu.

Lew
źródło
0

W Scali są dziesiątki miejsc, w których stosuje się podkreślenie. Używanie go do importowania symboli wieloznacznych jest tylko logiczną konsekwencją.

kiritsuku
źródło