0

我有一个使用 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")
4

1 回答 1

3

你想要f.send "#{x}=", "test"。在 Ruby 中,方法名称可能包含标点符号,例如=!。创建的方法attr_accessor :bar简单地命名为barand bar=。事实上,attr_accessor :bar它只是以下的简写:

def bar
  @bar
end

def bar=(value)
  @bar = value
end

当您调用foo.bar = "baz"时,您实际上是在调用该#bar=方法foo作为接收者并"bar"作为函数的第一个参数 - 即foo.bar=("baz"). Ruby 只是为以 结尾的方法提供语法糖,=以便您可以编写更自然的形式。

于 2014-01-02T22:09:03.943 回答