2012-04-03 29 views
11

Scala中有些東西似乎是不透明的,以我如以下時to不是Int成員函數:如何檢查隱/富含轉換,並用REPL實施特質

1.to(4) 

我可以檢查哪些行爲在沒有諮詢語言參考的情況下引起了這種(隱式轉換或特徵或其他)?那也是在REPL

如果REPL不能幫忙,有沒有一些友好的選擇?

回答

14

使用Scala 2.9:

~/code/scala scala -Xprint:typer -e "1 to 4" 
[[syntax trees at end of typer]]// Scala source: scalacmd4469348504265784881.scala 
package <empty> { 
    final object Main extends java.lang.Object with ScalaObject { 
    def this(): object Main = { 
     Main.super.this(); 
    () 
    }; 
    def main(argv: Array[String]): Unit = { 
     val args: Array[String] = argv; 
     { 
     final class $anon extends scala.AnyRef { 
      def this(): anonymous class $anon = { 
      $anon.super.this(); 
      () 
      }; 
      scala.this.Predef.intWrapper(1).to(4) 
     }; 
     { 
      new $anon(); 
     () 
     } 
     } 
    } 
    } 
} 

使用Scala 2.10或2.11:

scala> import reflect.runtime.universe 
import reflect.runtime.universe 

scala> val tree = universe.reify(1 to 4).tree 
tree: reflect.runtime.universe.Tree = Predef.intWrapper(1).to(4) 

scala> universe.showRaw(tree) 
res0: String = Apply(Select(Apply(Select(Ident(scala.Predef), newTermName("intWrapper")), List(Literal(Constant(1)))), newTermName("to")), List(Literal(Constant(4)))) 

scala> universe.show(tree) 
res1: String = Predef.intWrapper(1).to(4) 
+3

也'見:implicits -v'上REPL。 – 2012-04-04 01:42:30