获取Ruby中从此类接近方法的变量名称

时间:2013-10-18 15:29:43

标签: ruby metaprogramming metaclass

我想获得在类的方法中接近哪个类的变量的名称。像那样:

class Object
  def my_val
    "#{???} = '#{self.to_s}'"
  end
end

a1 = "val1"
a1.my_val # = a1 = 'val1'
a2 = "val2"
a2.my_val # = a2 = 'val2' 

我可以这样做吗?

2 个答案:

答案 0 :(得分:3)

对象不知道它可能存储或不存储的变量,在许多情况下,这是一个完全没有意义的概念。

你期望在这里发生什么?

ref = Object.new
another_ref = ref
@ref = another_ref
hash = { key: @ref }
array = [ hash[:key] ]
array[0].my_val
# => ...?

有很多方法可以引用一个对象。知道正在使用的名称是无关紧要的。

一般而言,变量只是赋予任意名称的引用,这些名称对于相关对象无关紧要。

您可以做的是提供背景:

my_var = "test"
my_var.my_val(:my_var)
# => my_var="test"

实施为:

def my_var(name)
  "#{name}=#{self.inspect}"
end

你也可以稍微提高一点并且聪明一点:

def dump_var(name)
  "%s=%s" % [ name, instance_variable_get(:"@#{name}").inspect ]
end

然后:

@foo = "test"
dump_var(:foo)
# => foo="test"

答案 1 :(得分:0)

我认为简短的回答是“不,你不能:/”。

对于Ruby(和大多数语言),变量名称没有意义。可以给你一个关于变量名的提示的唯一一个是编译器,它在整个其他抽象级别而不是Ruby内部。