2012-12-08 10 views
5

Tôi gặp sự cố với Predef.any2stringadd thật không may là officially considered not a PITA. Tôi đã thay đổi API của tôi từVapourise Predef.any2stringadd trong thông dịch viên

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

đến một cách tiếp cận kiểu lớp

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

Bây giờ tôi có thể ẩn rằng phương pháp khủng khiếp trong biên dịch mã như thế này:

import Predef.{any2stringadd => _} 

Tuy nhiên, điều này không trong môi trường REPL/phiên dịch của tôi.

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

Làm cách nào để thông dịch viên có thể làm phương pháp này gây khó chịu?

Trả lời

1

Một cách giải quyết có vẻ là để có những chuyển đổi ngầm ra khỏi đối tượng đồng Foo 's, và đặt nó trong hệ thống phân cấp đầu (object gói trong trường hợp thật của tôi):

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) 

Trong khi tôi không biết tại sao nên tạo ra bất kỳ sự khác biệt nào, có vẻ như nó đủ làm cho người thông dịch quên đi any2stringadd.

(Tuy nhiên, tôi nghĩ rằng một vé mới nên được mở trong một nỗ lực để loại bỏ phương pháp đó, cũng cho rằng nội suy chuỗi trong Scala 2,10 sẽ làm cho nó thừa hơn.)