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

时间:2012-12-28 19:20:20

标签: ruby metaprogramming

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

任何提示?

4 个答案:

答案 0 :(得分:5)

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

def foo
  bar @something
end

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

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

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'

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


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

答案 1 :(得分:1)

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

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

foo = Object.new
bar = foo
@baz = bar
@qux = bar

magic_method(foo) # what should the return value be and how would it know?

答案 2 :(得分:1)

您可以调用方法instance_variables来获取对象的所有实例变量的名称。注意,虽然实例变量只包含在之后的中,但它们已被初始化。

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

答案 3 :(得分:-1)

class Object
    def get_name
      line_number = caller[0].split(':')[1].to_i
      line_exectued = File.readlines( __FILE__)[line_number-1]
      line_exectued.match(/(\S+).get_name/)[1]
    end
end

inconceivable = true

p inconceivable.get_name