Ruby: использование Object.send для назначения переменных - PullRequest
16 голосов
/ 02 июля 2010

Есть ли способ сделать что-то подобное?

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)

Последняя строка приводит к ошибке:

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

Ответы [ 3 ]

23 голосов
/ 02 июля 2010
a.send(:c=, b.send(:c))

foo.bar = baz - это не вызов метода bar с последующим присваиванием - это вызов метода bar=. Таким образом, вы должны указать send, чтобы вызвать этот метод.

3 голосов
/ 02 июля 2010

Изменить последнюю строку на:

a.send(:c=, b.send(:c))
2 голосов
/ 13 июля 2016

Если вы заранее знаете имя переменной

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

Если c является динамической переменной, то вы можете сделать это следующим образом

c = 'my_key'
a.send("#{c}=", b.send(c))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...