2010-04-27 6 views
5

W jego programowania książki w Scala (rozdział 5 sekcja 5.9 str 93) Odersky wspomniane wyrażenie „bills !*&^%~ code!Czy Odersky jest poważny z "rachunki! * I ^% ~ kod!"?

W przypisie na tej samej stronie:

„Teraz powinieneś być w stanie zorientować się, że Biorąc pod uwagę ten kod, kompilator Scala będzie

powołać (bills.!*&^%~(code)).!()."

to kawałek tajemniczy dla mnie, może ktoś wyjaśnić, co tu się dzieje?

+0

Nikt nie wyjaśnił ", jeszcze. – ziggystar

+1

@ziggystar W pytaniu brakowało końcowego cytatu Nie jest to częścią kodu –

+1

Ja jeden myślę, że Pan Odersky powinien unikać zagmatwanych mnóstwa symboli i pisać wulgaryzmy w ASCII, przynajmniej to robię. –

Odpowiedz

9

To, co Odersky oznacza, to to, że możliwe byłoby posiadanie prawidłowego kodu wyglądającego w ten sposób. Na przykład, poniższy kod:

class BadCode(whose: String, source: String) { 
    def ! = println(whose+", what the hell do you mean by '"+source+"'???") 
} 

class Programmer(who: String) { 
    def !*&^%~(source: String) = new BadCode(who, source) 
} 

val bills = new Programmer("Bill") 
val code = "def !*&^%~(source: String) = new BadCode(who, source)" 
bills !*&^%~ code! 

Wystarczy skopiować & wklej go na REPL.

+0

@Daniel bardzo dziękuję za ten niesamowity przykład.Należy otrzymać odznakę scala balck belt – stacker

+0

@stacker Mam złotą odznakę, powinna wystarczyć na teraz. :-) –

2

Nie jestem pewien, czy książka dostarcza podpisów metody, ale zakładam, że to tylko komentarz na cukier składniowej Scala więc zakłada po wpisaniu:

bill add monkey 

gdzie znajduje się rachunek obiektu, który ma metodę add który pobiera parametr, automatycznie interpretuje go jako:

bill.add(monkey) 

Będąc trochę zardzewiałą Scali, nie jestem do końca pewien, jak dzieli kod! do (code).!() z wyjątkiem niejasnego łaskoczenia szarych komórek, które! operator służy do odpalenia aktora, który w terminach kompilatora może zostać zinterpretowany jako niejawna metoda.!() na obiekcie.

+0

+1 za wyjaśnienie opcjonalnego ".()", co z tym hałaśliwym "! * & ^% ~" czy one mają jakiś sens? – stacker

3

Okres jest opcjonalny dla wywołania metody, która przyjmuje pojedynczy parametr lub ma pustą listę parametrów.

Gdy funkcja ta jest używana, zakłada się, że następny fragment po spacji następującej po nazwie metody jest pojedynczym parametrem.

Dlatego

(rachunki.! * & ^% ~ (kod)).!().

jest identyczna

rachunki! * ^% ~ & kod!

Drugi wykrzyknik wywołuje metodę zwracanej wartości z pierwszego wywołania metody.

+0

+1 dla objaśnienia opcjonalnego "." , co z tym hałaśliwym "! * & ^% ~" czy one mają jakiś sens? – stacker

+0

stacker: w Scala, możesz nadać nazwy metod używając (prawie) dowolnych znaków, które lubisz. Jest to po prostu metoda o nazwie '! * &^% ~ '. – Jesper

2

Kombinacja ".()" Jest opcjonalna z wywołaniami metod (jak wyjaśniono powyżej Wysawyg) i możliwość użycia (prawie) dowolnych znaków do nazw metod, umożliwia pisanie metod w Scali, które wyglądają jak przeciążenie operatora. Możesz nawet wymyślić własnych operatorów.

Na przykład mam program, który zajmuje się grafiką komputerową 3D. Mam własną klasę Vector do reprezentującą wektor 3D:

class Vector(val x: Double, val y: Double, val z: Double) { 
    def +(v: Vector) = new Vector(x + v.x, y + v.y, z + v.z) 

    // ...etc. 
} 

Ja również zdefiniowaną metodę ** (nie pokazano powyżej), aby obliczyć cross product dwóch wektorów.To bardzo wygodne, że można tworzyć własne operatory w Scali, nie wiele innych języków programowania ma taką elastyczność.

Powiązane problemy