2012-11-13 10 views
10

mogę nazwać obiektów, takich jak to, ale nie można nazwać m:Inflikacja Scala z obiektem +, dlaczego nie jest możliwa?

object + { 
    def m (s: String) = println(s) 
} 

Nie można wywołać +.m("hi"):

<console>:1: error: illegal start of simple expression 
     +.m("hi") 

również nie można nazwać + m "hi" (korzystny dla DSL-usage).

Ale z object ++ działa dobrze! Czy są one sprzeczne z (nieistniejącymi) metodami? Czy można tego uniknąć?

+1

Niestety nie mam nic lepszego niż domysły, dlaczego ciebie nie można użyć +, ale można użyć '$ plus.m (" hi ")' – Austin

Odpowiedz

11

Rzeczywiście nie jest to możliwe w przypadku operatorów jednoargumentowych. Jeśli chcesz to nazwać tak czy inaczej, można odwołać się do korzystania z nazwy wygenerowany przez kompilator dla JVM (który zaczyna się od dolara):

scala> object + { 
    | def m(s: String) = println(s) 
    | } 
defined module $plus 

scala> +.m("hello") 
<console>:1: error: illegal start of simple expression 
     +.m("hello") 
     ^

scala> $plus.m("hello") 
hello 
6

Uważam, że problemem jest to, że w celu obsługi operatorów Jednoargumentowy bez dwuznaczność, scala polega na specjalnym przypadku: tylko !, +, - i ~ są traktowane jako operatory jednoargumentowe. Tak więc w +.m("hi"), scala traktuje się jako operatora jednoargumentowego i nie może nadać sensu całemu wyrażeniu.

1

innego kodu przy użyciu pakietu:

object Operator extends App { 
    // http://stackoverflow.com/questions/13367122/scalas-infix-notation-with-object-why-not-possible 
    pkg1.Sample.f 
    pkg2.Sample.f 
} 

package pkg1 { 
    object + { 
     def m (s: String) = println(s) 
    } 

    object Sample { 
     def f = { 
      // +.m("hi") => compile error: illegal start of simple expression 
      // + m "hi" => compile error: expected but string literal found. 
      $plus.m("hi pkg1") 
      $plus m "hi pkg1" 
     } 
    } 
} 

package pkg2 { 
    object + { 
     def m (s: String) = println(s) 
    } 

    object Sample { 
     def f = { 
      pkg2.+.m("hi pkg2") 
      pkg2.+ m "hi pkg2" 
      pkg2.$plus.m("hi pkg2") 
      pkg2.$plus m "hi pkg2" 
     } 
    } 
} 

wersja java "1.7.0_09"

Scala wersja kodu biegacz 2.9.2

Powiązane problemy