2008-09-19 24 views
12

thể trùng lặp:
What does map(&:name) mean in Ruby?Hiểu [ClassOne, ClassTwo] .each (&: my_method)

Tôi đã xem một railscast và thấy mã này.

[Category, Product].(&:delete_all) 

Về việc xóa cơ sở dữ liệu.

tôi hỏi về các dòng trong IRC và được cho biết

(&:delete_all) 

là một phím tắt cho

{|model| model.delete_all} 

Tôi thử nghiệm này như sau

class ClassOne 
    def class_method 
    puts 1 
    end 
end 

class ClassTwo 
    def class_method 
    puts 2 
    end 
end 

[ClassOne, ClassTwo].each(&:class_method) 

tôi nhận được một lỗi nói

Wrong Argument type Symbol (expected Proc) 

Tôi cũng đã cố gắng

one = ClassOne.new 
two = ClassTwo.new 

[one, two].each(&:class_method) 

Nhưng điều đó vẫn thất bại.

Nếu tôi sửa đổi nó để đọc

[one, two].each{|model| model.class_method} 

Tất cả mọi thứ đã làm việc như mong đợi.

Vì vậy, &:delete_all thực sự làm gì? Các tài liệu nói delete_all là một phương pháp, vì vậy tôi bối rối như những gì đang xảy ra ở đây.

Trả lời

20

này dựa vào một phần mở rộng 1,9 Ruby đó có thể được thực hiện trong 1,8 bằng cách bao gồm những điều sau đây:

class Symbol 
    def to_proc 
     proc { |obj, *args| obj.send(self, *args) } 
    end 
end 

Tôi tin rằng Rails định nghĩa này trong ActiveSupport.

+0

Điều này là chính xác; nếu bạn chạy thử nghiệm của bạn trong irb, nó sẽ không hoạt động (giả sử bạn đang chạy Ruby 1.8.x). Hãy thử lại trong script/console. –

3

Đó là một số bản vá Rails cụ thể của Ruby, symbol to proc.

+0

Câu trả lời này được sử dụng là đúng, nhưng Ruby 1.8.6 và trước đó thực sự là di sản. –

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