我有一个使用attr_accessor的对象。我希望能够使用#send
的变量在该对象上调用方法。我的问题是=
方法似乎不起作用。
class Foo
attr_accessor :bar
end
class Test_class
def test_method(x)
f = Foo.new
f.send(x)
f.send(x) = "test" #this doesnt work
f.send("#{x} =") "test" #this also doesn't work
# How can I set bar?
end
end
t = Test_class.new
t.test_method("bar")
答案 0 :(得分:3)
你想要f.send "#{x}=", "test"
。在Ruby中,方法名称可能包含标点符号,例如=
或!
。 attr_accessor :bar
创建的方法只需命名为bar
和bar=
。事实上,attr_accessor :bar
只是简写:
def bar
@bar
end
def bar=(value)
@bar = value
end
当您致电foo.bar = "baz"
时,您实际上正在调用#bar=
方法,其中foo
作为接收方,"bar"
作为该函数的第一个参数 - 是,foo.bar=("baz")
。 Ruby只为以=
结尾的方法提供语法糖,以便您可以编写更自然的形式。