在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'

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

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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...