2012-12-08 2 views
5

Mam problem z Predef.any2stringadd, który niestety jest officially considered not a PITA. Zmieniłem API zVapourise Predef.any2tringadd in interpreter

trait Foo { 
    def +(that: Foo): Foo 
} 

do podejścia klasy typu

object Foo { 
    implicit def fooOps(f: Foo): Ops = new Ops(f) 
    final class Ops(f: Foo) { 
     def +(that: Foo): Foo = ??? 
    } 
} 
trait Foo 

Teraz mogę ukryć, że straszna metoda skompilowany kod tak:

import Predef.{any2stringadd => _} 

Jednak to się nie powiedzie w moim środowisku REPL/interpretera.

val in = new IMain(settings, out) 
in.addImports("Predef.{any2stringadd => _}") // has no effect? 

Jak mogę powiedzieć tłumaczowi, aby ten irytujący sposób zadziałał?

Odpowiedz

1

Rozwiązaniem wydaje się być trochę niejawna konwersja z Foo „s towarzysza obiekt i umieścić go w górę hierarchii (obiekt pakietów w moim przypadku rzeczywistym):

object Foo { 
// implicit def fooOps(f: Foo): Ops = new Ops(f) 
    final class Ops(f: Foo) { 
     def +(that: Foo): Foo = ??? 
    } 
} 
trait Foo 
implicit def fooOps(f: Foo): Foo.Ops = new Foo.Ops(f) 

Chociaż nie Wiem, dlaczego to powinno coś zmienić. Wygląda na to, że wystarczy, aby tłumacz zapomniał o any2stringadd.

(Mimo to, myślę, że nowy bilet powinien być otwarty w próbie usunięcia tej metody, również biorąc pod uwagę, że interpolacja ciągu w Scala 2.10 uczynią go bardziej zbędne.)