2010-07-02 22 views
14

Có cách nào để làm điều gì đó như thế này không?Ruby: sử dụng Object.send để gán các biến

a = Struct.new(:c).new(1) 
b = Struct.new(:c).new(2) 

a.send(:c) 
=> 1 

b.send(:c) 
=> 2 

a.send(:c) = b.send(:c) 

Kết quả dòng cuối cùng trong lỗi:

syntax error, unexpected '=', expecting $end 
a.send(:c) = b.send(:c) 
      ^

Trả lời

20
a.send(:c=, b.send(:c)) 

foo.bar = baz không phải là một cuộc gọi đến các phương pháp bar tiếp theo là một nhiệm vụ - đó là một cuộc gọi đến phương pháp bar=. Vì vậy, bạn cần phải thông báo cho send để gọi phương thức đó.

+0

Bạn có nghĩa là 'bar ='. – Adrian

+0

@Adrian: Vâng, tôi đã làm. Cảm ơn. – sepp2k

3

Thay đổi dòng cuối cùng để:

a.send(:c=, b.send(:c)) 
1

Nếu bạn biết tên biến trước

a.send(:c=, b.send(:c)) 

Nếu c là một biến động thì bạn có thể làm điều đó như thế này

c = 'my_key' 
a.send("#{c}=", b.send(c)) 
Các vấn đề liên quan