【发布时间】:2013-07-30 21:00:42
【问题描述】:
如何动态访问 Ruby 实例变量/方法?我基本上是在以下 PHP 代码的 Ruby 等价物之后......
$foo = new Foo;
$bar = 'bar';
echo $foo->$bar;
echo $foo->$bar();
【问题讨论】:
标签: php ruby variables dynamic
如何动态访问 Ruby 实例变量/方法?我基本上是在以下 PHP 代码的 Ruby 等价物之后......
$foo = new Foo;
$bar = 'bar';
echo $foo->$bar;
echo $foo->$bar();
【问题讨论】:
标签: php ruby variables dynamic
#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 将起作用,但通常最好避免使用它。
【讨论】:
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]
【讨论】:
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"
【讨论】: