首先:您不能使用Object#send
. Object#send
发送消息,它不设置实例变量。当然,您可以发送一条消息,该消息可能会或可能不会依次调用一个方法,该方法可能会或可能不会反过来设置实例变量,但这不是做的Object#send
,而是响应调用的任何方法的做您发送的消息。
如果要动态设置实例变量,请使用Object#instance_variable_set
:
class Dog
def initialize(**attrs)
attrs.each do |attr, value|
instance_variable_set(:"@#{attr}", value)
end
end
end
dog = Dog.new(talk: 'bruuuf')
然而,在这种情况下,看起来您实际上并不想设置实例变量,而是调用 setter 方法。Setter 方法的名称以=
符号结尾,例如Dog#talk=
:
class Dog
def initialize(**attrs)
attrs.each do |attr, value|
send(:"#{attr}=", value)
end
end
end
dog = Dog.new(talk: 'bruuuf')
当然,请注意,这假定该方法Dog#talk=
实际存在。如果没有,您将获得一个NoMethodError
.