由attr_accessor创建的Ruby方法名称中的变量

时间:2014-01-02 22:05:27

标签: ruby variables attr-accessor

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

1 个答案:

答案 0 :(得分:3)

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

def bar
  @bar
end

def bar=(value)
  @bar = value
end

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