2013-07-31 7 views
7

Patrzę na kod źródłowy innej osoby (Scala), gdzie widzę operatora :+= wywoływanego na zmiennej typu IndexedSeq. Rozglądam się po stronie skaladocs dla tej klasy, aby dowiedzieć się, co robi ten operator, ale nie widzę tego. Myślę, że albo jest zdefiniowany w klasie spoza hierarchii dziedziczenia IndexedSeq, albo javascript na stronie skaladocs ukrywa go gdzieś, czego nie widzę. (Właściwie to nie jest, zobacz odpowiedź poniżej.)Jak znaleźć definicję metod/operacji zdefiniowanych w niejawnie skonwertowanej klasie?

Uderzyłem każdy przycisk na stronie scaladocs, próbując odkryć wszystko. Sprawdziłem kod HTML strony internetowej. Musi istnieć sposób na wyszukanie operatora z dokumentacji klasy, do której można go zastosować. Czy nie ma?

(NB. Rozejrzałem się, że operator korzystając symbolhound, więc wiem, co to operator oznacza teraz to pytanie jest o dokumentacji scala w ogóle, a nie tego konkretnego operatora.)

Odpowiedz

9

Wszystkie operatory w Scali są normalnymi metodami.

nie można go znaleźć, ponieważ jest kompilator magia do ponownego ASSIGNMENT, to nie operator. Albo powiedzieć inaczej: wygląda na operatora, ale w rzeczywistości jest "operatorem, a następnie znakiem" = ".

Kompilator zamieni to magicznie w zadanie, jeśli operator (tutaj :+) zwróci prawidłowy typ, a oryginalna wartość to oczywiście: var.

Ponieważ nie jest dostarczany przez żadną z niejawnych ani jawnych metod na Seq[T] lub czymkolwiek, nie pojawia się nigdzie w wygenerowanym skaladoc.

więc odpowiedzieć na pytanie ogólne:

  • To jest konstruktem język, więc jedynym miejscem, gdzie jest to udokumentowane jest specyfikacja, niestety,
  • , ale jeśli znajdziesz jakieś "<?>=" nieznany operator gdzieś , poszukaj definicji "<?>", która z pewnością zostanie udokumentowana.

Edycja: W końcu stwierdzono, gdy jest to określone w SLS:

§6.12.4:

Operator zadaniem jest symbolem operatora (kategoria OP składni w 1.1)), które kończy się znakiem równości „=” z wyjątkiem operatorów, dla których jednym z następujących warunkach zachodzi:

(1), operator uruchamia również równości postać lub

(2) operator jest jednym z (< =), (> =), (! =).

Później mówi również, że dzieje się tak tylko wtedy, gdy wszystkie inne opcje zostały wypróbowane (w tym potencjalne implikacje).

+0

To jest dobre. Nic o tym w indeksie "Programowanie w Scali" w "=" (ani w tym przypadku "przydział" ani "przeniesienie"). Dziękuję Ci! –

+0

Ale powiedz, jeśli zrobię własną klasę metodą '+' i wypróbuję powyższe. To działa. Ale zamiast '+' jeśli spróbuję powiedzieć inną nazwę metody powiedzieć 'add', to nie działa. 'class A (val n: Int) { def dodaj (o: A) = new A (n + o.n) }' i spróbuj wykonać 'var i = new A (1); dodaję = nowe A (2) '. To nie działa. Zastąpienie 'add' przez' + 'działa zgodnie z oczekiwaniami. Interesujące jest to, że jest jakakolwiek rzecz określona w dokumentacji – Jatin

+0

@ AdamMackler PiS index pod '+ =' reassignment z niezmiennymi setami i vars. Wskazuje na http://www.artima.com/pins1ed/next-steps-in-scala.html#step10, gdzie nie tylko dowiesz się, co + = oznacza, ale w Scali "mieszasz" cechy. Tyle do pochłonięcia! –

1

Jest to wartość przypisana do zmienna? Jeśli jest to przypadek Myślę, że to cukier składni:

scala> var x = IndexedSeq(1,2,3) 
x: IndexedSeq[Int] = Vector(1, 2, 3) 

scala> x :+= 10 

scala> x 
res59: IndexedSeq[Int] = Vector(1, 2, 3, 10) 

scala> val y = IndexedSeq(1,2,3) 
y: IndexedSeq[Int] = Vector(1, 2, 3) 

scala> y :+= 10 
<console>:16: error: value :+= is not a member of IndexedSeq[Int] 
      y :+= 10 
      ^

Jest cukier składni dla "pracy i przydziału", jak +=:

scala> var x = 10 
x: Int = 10 

scala> x += 1 

scala> x 
res63: Int = 11 

które de-cukry do x = x + 1.

Powiązane problemy