【问题标题】:Get the name of variable with which a method was approached from this class in Ruby获取从 Ruby 中的此类接近方法的变量的名称
【发布时间】:2013-10-27 12:24:52
【问题描述】:

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

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

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

我可以吗?

【问题讨论】:

  • 你的帖子不清楚..
  • @ArupRakshit,对不起,我不知道如何解释。我认为这个例子很清楚。
  • 您只使用了def,但它应该是def..end 块。 ruby-doc.org/docs/keywords/1.9/Object.html#method-i-def
  • @ArupRakshit,哦,我只是 ruby​​ 的初学者,这是 scala 的风格 :) 已修复
  • 还是不清楚... :)

标签: ruby metaprogramming metaclass


【解决方案1】:

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

对于 Ruby(和大多数语言),变量名没有意义。唯一能给你关于变量名的提示的是编译器,它处于与 Ruby 内部完全不同的抽象级别。

【讨论】:

    【解决方案2】:

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

    您希望在这里发生什么?

    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"
    

    【讨论】:

    • 我知道 Ruby 擅长元编程,我认为这可能是真的。我喜欢你的 dump_var 方法,谢谢!
    • Ruby 提供了很多反射能力,但有些东西并不容易暴露出来。回溯对对象的所有引用是理论上可行但也不容易的事情之一。
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多