2011-10-19 26 views
16

gì @ đứng tại các mã Ruby sau:gì @ đứng trong một tên hàm của Ruby

module TestRocket 
    extend Module.new { attr_accessor :out } 

    def _test(a, b); send((call rescue()) ? a : b); end 

    def [email protected]; _show _test :_pass, :_fail end 
    def [email protected]; _show _test :_fail, :_pass end 
    def [email protected]; _show _pend;    end 
    def [email protected]; _show _desc;    end 

    def _show(r); (TestRocket.out || $>) << r; r end 
    def _pass; "  OK\n"; end 
    def _fail; " FAIL @ #{source_location * ':'}\n"; end 
    def _pend; "PENDING '#{call}' @ #{source_location * ':'}\n"; end 
    def _desc; " FIRE '#{call}'!\n"; end 
end 

Proc.send :include, TestRocket 

Sau đó, điều này được sử dụng như:

+-> { Die.new(2) } 
--> { raise } 
+-> { 2 + 2 == 4 } 

như thế nào @ biến thành ' -> 'trong tên hàm?

+0

câu hỏi hay. Tôi chưa bao giờ thấy điều này. Nhưng nếu bạn thử và chạy '+ -> {2 + 2 == 4}' mà không có nó, bạn sẽ gặp lỗi 'NoMethodError: phương thức undefined' + @ 'cho # '. Vì vậy, tôi đoán đây là một phương pháp kỳ diệu từ ruby ​​1.9 –

+0

Kho lưu trữ của TestRocket là https://github.com/peterc/testrocket –

Trả lời

15

Các tên phương pháp cho bốn nhà khai thác unary +, -, ~, và ![email protected], [email protected], [email protected], và [email protected]. Vì vậy, các định nghĩa phương thức tìm kiếm vui nhộn:

def [email protected]; _show _test :_pass, :_fail end 
def [email protected]; _show _test :_fail, :_pass end 
def [email protected]; _show _pend;    end 
def [email protected]; _show _desc;    end 

chỉ định nghĩa quá tải cho bốn toán tử đơn nhất đó. Sau đó, TestRocket được vá vào lớp Proc sử dụng Proc.send :include, TestRocket.

này:

-> { Die.new(2) } 

chỉ đơn giản là một nét lambda và một cách khác để viết lambda { Die.new(2) }. Sau đó, với TestRocket vá vào Proc chúng ta có thể nói điều này:

+-> { Die.new(2) } 
# + lambda { Die.new(2) } 

và nó sẽ chạy phương pháp này:

def [email protected]; _show _test :_pass, :_fail end 

như một phương pháp dụ trên lambda đó.

Có vẻ như một chút lạm dụng toán tử quá tải để "phát minh" thứ gì đó trông giống như các toán tử mới -->, ~->, ....

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