2011-01-02 25 views
18

Thực tế là các kiểu cấu trúc được thực hiện thông qua sự phản chiếu. Có thể có bất kỳ cấu trúc ngôn ngữ nào khác sử dụng sự phản chiếu không?Tính năng nào của Scala được thực thi bên trong bằng cách sử dụng sự phản chiếu?

+0

Cảm ơn tất cả các bạn đã trả lời! Tôi không thực sự chắc chắn phải làm gì vào thời điểm này. Sẽ không công bằng khi chấp nhận một người trong trường hợp này, nhưng cũng không thể chấp nhận nhiều người trong số họ. –

+0

chấp nhận một đối tượng ẩn danh vì nó là duy nhất (ngoài các loại cấu trúc nói chung), nơi sự phản chiếu có thể khiến bạn gặp rắc rối về hiệu suất nghiêm trọng. (Có lẽ đó chỉ là tôi, nhưng tôi không thể để lại một trong những câu hỏi của tôi mà không có câu trả lời được chấp nhận.) –

Trả lời

15

này liên quan chặt chẽ với các loại cấu trúc, nhưng bất kỳ trường hợp đối tượng ẩn danh, tức là

new { def print = ("hello world") }.print 

sẽ sử dụng phản ánh.

http://scala-programming-language.1934581.n4.nabble.com/Structural-types-reflection-td3071599.html

+4

+1: Điều này có ý nghĩa khi xác định chuyển đổi tiềm ẩn, do đó, nó rất đáng để chỉ ra một cách riêng biệt. Tóm lại, luôn luôn định nghĩa một lớp * có tên * nằm ngoài hàm 'implicit' và định nghĩa một hàm * riêng biệt * ẩn để chuyển đổi thành lớp đó. –

+0

Đây chính xác là những gì tôi làm khi tôi xác định một chuyển đổi tiềm ẩn để thêm một phương thức vào một lớp - thời gian để thay đổi. – Russell

5

Nếu bạn xem xét isInstanceOf/asInstanceOf như phản ánh, sau đó mô hình phù hợp dựa trên chúng

+1

Đó không phải là sự phản chiếu, đó là việc kiểm tra và đúc kiểu và rất nhanh. – vadipp

+0

@vadipp - vâng, có vẻ như chúng ta không nên ngại sử dụng nó bất cứ khi nào chúng tôi có khuynh hướng làm như vậy: http://stackoverflow.com/questions/103564/the-performance-impact-of-using-instanceof-in- java – bbarker

1

Nó không phải là một cấu trúc ngôn ngữ, nhưng ScalaTest bao gồm Suite.execute, trong đó sử dụng phản ánh để tìm và gọi các phương pháp kiểm tra.

Hình ảnh pattern matching của Scala có sử dụng bất kỳ phản ánh nào đằng sau hậu trường không?

+0

Afaik, đối sánh mẫu chỉ sử dụng các phương thức kiểm tra kiểu, kiểu đúc và phương thức 'không áp dụng '. Đối với các lớp thư viện chuẩn, trình biên dịch cũng có thể tạo ra các switch JVM nguyên bản, các cấu trúc 'if-else' và như vậy. Phản ánh là không cần thiết ở đây. – vadipp

+0

_What_ là loại kiểm tra, thực sự? – matanster

5

Phương pháp gọi trong các loại cấu trúc phụ thuộc vào phản ánh:

type T = { def startsWith(x:String):Boolean } 
def doSomethingWith(x:T) = x.startsWith("abc") 
doSomethingWith("abcdef") 
+2

OP được đề cập cụ thể về các loại cấu trúc và được yêu cầu cho các ví dụ khác. –

+0

@pelotom: thông báo OP cũng là Ken Bloom. – IttayD

+0

@IttayD: Huh? OP là @Nermin Serifovic –

10

Enumerations dùng phản ánh để tìm hiểu về tất cả các giá trị có thể cho việc đếm cho nameOf chức năng. (Xem phương thức populateNameMap trong Enumeration.scala). Điều này được thực hiện một lần, lần đầu tiên bạn gọi nameOf cho loại Enumeration cụ thể.

2

Trình thông dịch Scala sử dụng rất nhiều phản ánh.

Các vấn đề liên quan