2012-07-01 37 views
6

Tôi đã cố gắng để làm theo một ví dụ từ một câu hỏi khác, và tôi đi theo một cái gì đó tôi không thể giải thích:hành vi kỳ lạ với sự phản ánh trong Scala

scala> import scala.reflect.runtime.{currentMirror => m} 
import scala.reflect.runtime.{currentMirror=>m} 

scala> m.mkToolBox() 
<console>:12: error: value mkToolBox is not a member of reflect.runtime.universe.Mirror 
       m.mkToolBox() 
       ^

scala> import scala.tools.reflect.ToolBox 
import scala.tools.reflect.ToolBox 

scala> m.mkToolBox() 
res3: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = [email protected] 

Tại sao mkToolBox chưa là thành viên của m trước khi nhập ToolBox, nhưng là gì sau đó?

Trả lời

2

Nếu tôi kiểm tra nó với reify, tôi thấy điều này:

scala> reify{ m.mkToolBox() }.tree 
res4: reflect.runtime.universe.Tree = 
{ 
    val qual$1 = scala.tools.reflect.`package`.ToolBox(scala.reflect.runtime.`package`.m); 
    val x$1 = qual$1.mkToolBox$default$1; 
    val x$2 = qual$1.mkToolBox$default$2; 
    qual$1.mkToolBox(x$1, x$2) 
} 

Điều đó có nghĩa là một phương pháp gọi đến một hàm có tên ToolBox bên trong đối tượng gói scala.tools.reflect. Nó không phải là một đối tượng, bởi vì reify sẽ phơi bày phương pháp apply.

Vì vậy, mặc dù API Docs for the Compiler không hiển thị bất kỳ điều gì ngoại trừ đặc điểm ở bên trái, nếu bạn nhìn vào gói, bạn sẽ thấy định nghĩa phương thức ẩn.

PS: Vâng, đây là một câu hỏi thực sự. Ý nghĩ về một phương pháp bắt đầu viết hoa có cùng tên của một đặc điểm không xảy ra với tôi, cho đến khi tôi nghĩ đến việc sửa đổi thứ để lấy cây.

+0

Những gì tôi làm trong các tình huống như vậy: Tôi tìm đến các nguồn để nhận ra những gì đang diễn ra ở đó. ;) – sschaef

+0

@Antoras Nó đã được một thời gian dài kể từ khi một số mã Scala trái tôi befuddled như ý nghĩa của nó. Lời giải thích là khá rõ ràng, nhưng suy nghĩ của 'ToolBox' như một phương pháp thực sự đã không xảy ra với tôi. –

3

ToolBox là lớp ẩn chứa pimps mkToolBox vào Mirror. Cùng một câu chuyện với Eval, có pimps eval.

+0

Một lớp tiềm ẩn? Điều đó chắc chắn giải thích phương pháp được đặt tên độc đáo. –