在ruby中从自身获取实例变量名称

我有一个实例变量@foo ,我想写一些代码,以便我得到字符串'foo'

任何提示?

如果您拥有的只是对象的引用,那么您无法干净利落地完成它。

 def foo bar @something end def bar(value) value # no clean way to know this is @something end 

我能想到的唯一的黑客是遍历自己的所有实例变量,寻找匹配。 但这是一个非常混乱的方法,可能会很慢。

 def bar(value) instance_variables.each do |ivar_name| if instance_variable_get(ivar_name) == value return ivar_name.to_s.sub(/^@/, '') # change '@something' to 'something' end end # return nil if no match was found nil end @something = 'abc123' bar @something # returns 'something' # But passing the same value, will return a value it's equal to as well bar 'abc123' # returns 'something' 

这是有效的,因为instance_variables返回一个符号数组,这些符号是实例变量的名称。

 instance_variables #=> [:@something, :@whatever] 

instance_variable_get允许您通过它的名称获取值。

 instance_variable_get :@something # note the @ #=> 'abc123' 

结合这两种方法,您可以接近您想要的。


明智地使用它。 在使用基于此的解决方案之前,看看您是否可以以某种方式重构事物,以便不需要。 元编程就像一门武术。 你应该知道它是如何工作的,但要尽可能避免使用它。

在Ruby中,您只能操纵对象。 变量(包括实例变量)不是对象。

此外,在这种情况下,你希望你的魔术方法返回什么:

 foo = Object.new bar = foo @baz = bar @qux = bar magic_method(foo) # what should the return value be and how would it know? 

您可以调用方法instance_variables来获取对象的所有实例变量的名称。 但请注意,实例变量仅在初始化后才包含在该列表中。

 >> class A; attr_accessor :foo; end => nil >> a = A.new => # >> a.instance_variables => [] >> a.foo = 42 => 42 >> a.instance_variables => ["@foo"]