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?


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.


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.


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.