如何动态访问Ruby实例变量/方法?

时间:2013-07-30 15:51:35

标签: php ruby variables dynamic

如何动态访问Ruby实例变量/方法?我基本上遵循以下PHP代码的Ruby等价物......

$foo = new Foo;
$bar = 'bar';

echo $foo->$bar;
echo $foo->$bar();

3 个答案:

答案 0 :(得分:4)

#send方法采用方法名称。您可以在字符串上调用#intern以从中生成符号。所以这是等价的:

foo = Foo.new
bar = 'bar'
puts foo.send(bar.intern)

默认情况下,实例变量是私有的。要公开它们,通常要做的是在类定义中添加attr_reader调用:

class Foo
  attr_reader :bar

  def initialize(value_of_bar)
    @bar = value_of_bar
  end
end

bar = 'bar'
foo = Foo.new("bar_value")
puts foo.bar # => "bar_value"
puts foo.send(:bar) # => "bar_value"
puts foo.send(bar.intern) # => "bar_value"

要访问和访问没有阅读器方法的实例变量,#instance_variable_get将起作用,但通常最好避免使用它。

答案 1 :(得分:3)

class Foo
  def initialize
    @x = 10
  end
  def test
    @x
  end
end
foo = Foo.new
foo.instance_variables
# => [:@x]
foo.instance_variable_get(:@x)
# => 10
Foo.instance_methods(false)
# => [:test]
Foo.instance_methods(false).map{|i| foo.method(i).call}
# => [10]
Foo.instance_methods(false).map{|i| foo.send(i)}
# => [10]

答案 2 :(得分:1)

instance_variable_get(不要忘记@)。

class Foo
  def initialize
    @ivar = "hello"
  end
end

foo = Foo.new

foo.instance_variable_get :@ivar
#=> "hello"

或者在课堂上提供一个访问者

class Bar
  attr_reader :ivar

  def intialize
    @ivar = "hey"
  end
end

Bar.new.ivar
#=> "hey"