Jak kompiluje się następujący plik:
import scala.concurrent.duration._
val time = 20 seconds
Co tu się właściwie dzieje?
Odpowiedzi:
Dzieje się kilka rzeczy.
Po pierwsze, Scala pozwala na pomijanie kropek i paren w wielu wywołaniach metod, więc 20 seconds
jest odpowiednikiem 20.seconds()
*.
Po drugie, stosowana jest „niejawna konwersja”. Ponieważ 20
jest Int
i Int
nie ma seconds
sposobu, kompilator przeszukuje niejawna konwersja, która pobiera Int
i zwraca coś, co ma się seconds
metodę, przy poszukiwaniu ograniczony zakresem swojej wywołania metody.
Zaimportowałeś DurationInt do zakresu. Ponieważ DurationInt
jest to niejawna klasa z Int
parametrem, jej konstruktor definiuje niejawną Int => DurationInt
konwersję. DurationInt
ma seconds
metodę, więc spełnia wszystkie kryteria wyszukiwania. Dlatego kompilator przepisuje Twoje wywołanie na new DurationInt(20).seconds
**.
* Mam na myśli to luźno. 20.seconds()
jest faktycznie nieprawidłowy, ponieważ seconds
metoda nie ma listy parametrów i dlatego parametry muszą zostać pominięte w wywołaniu metody.
** Właściwie nie jest to do końca prawdą, ponieważ DurationInt
jest to klasa wartości, więc kompilator uniknie zawijania liczby całkowitej, jeśli to możliwe.
new DurationInt(20).seconds()
, o ile wiesz, jak to robi)
seconds
metoda jest zdefiniowana bez parenów, więc wywołanie jej z parens jest błędem.
20.seconds()
w Scali, tylko że kompilator tłumaczy wywołanie w ten sposób. Warto zauważyć, że Scala wymaga pominięcia parenów, jeśli odpowiednia metoda nie ma listy parametrów, jak w tym przypadku.
„Magia”, która tam się dzieje, nazywa się „niejawną konwersją”. Importujesz niejawne konwersje, a niektóre z nich obsługują konwersję między Int (i Double) na Duration. Z tym właśnie masz do czynienia.
import scala.concurrent.duration._
rozwiązuje się, 20 seconds
ale w rzeczywistości importowanie DurationConversions
cechy nie? EDYCJA : Właśnie zdałem sobie sprawę, że tak naprawdę importują DurationInt
. Zgaduję, że dzieje się tak, ponieważ nie możesz zaimportować rzeczywistej cechy? Tylko konkretna realizacja cechy?