2009-06-10 20 views
17

Tôi đang cố gắng hiểu mã Ruby sau.Gọi self.send lặp lại trên một đối số băm để khởi tạo()

Có vẻ như attrs là một băm được chuyển thành đối số với giá trị mặc định của một băm trống.

Sau đó, attrs.each lặp lại các cặp khóa, giá trị trong mã băm (|k,v|).

Hiệu quả đạt được bằng cách gọi self.send trên các phần tử của cặp giá trị khóa trong lần lặp này?

def initialize(attrs = {}, *args) 
    super(*args) 
    attrs.each do |k,v| 
    self.send "#{k}=", v 
    end 
end 
+0

+1 Tôi thích sử dụng mã này để linh hoạt tạo đối tượng/khởi tạo. Xem câu trả lời của tôi @ http://stackoverflow.com/questions/1778638/idiomatic-object-creation-in-ruby/5272354#5272354 – abe

Trả lời

21

send gọi phương thức trong tham số đầu tiên và chuyển phần còn lại của tham số làm đối số.

Trong trường hợp này, tôi giả sử những gì trong attrs là danh sách các thuộc tính. Hãy nói rằng đó là một cái gì đó như thế này:

{ :name => "John Smith" } 

Vì vậy, sau đó trong vòng lặp, nó thực hiện điều này:

self.send "name=", "John Smith" 

tương đương với

self.name = "John Smith" 
+0

Tuyệt. Cảm ơn. Vì vậy, điều đó có nghĩa trong tên ví dụ của bạn trở thành một phương thức lớp, đúng - vì tên [self.]? – franz

+2

Trước hết, ví dụ đó không tạo ra một phương thức nào cả - nó gọi phương thức 'name =', cái đã phải tồn tại. Thứ hai, tự bên trong một phương thức thể hiện (như khởi tạo) đề cập đến cá thể. Vì vậy, đây là gọi một phương pháp dụ. – Chuck

+0

Điều đáng nói đến là các phương thức 'name =' được tạo tự động bởi helper 'attr_accessor: name'. –

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