我可以从其受让人那里获取变量名称吗?

时间:2019-03-06 22:40:56

标签: ruby

是否有一个类方法可以打印其父类分配给的变量的名称?示例:

class Test
  def who_am_I_assigned_to
    puts "#{??}"
  end
end

THIS = Test.new
THIS.who_am_I_assigned_to
# >> THIS

1 个答案:

答案 0 :(得分:0)

从技术上讲是这样的。

但是您必须递归搜索每个对象的所有instance_variables。而且,as Cary points out可以一次将一个对象分配给多个变量。

不要那样做。

  

之所以要查找此行为,是因为使用了变量名,但也将其用作数据网格中的位置。因此,如果具有二维网格,则变量名称将类似于“ AA”,“ AB”,“ BC”等。众所周知,它的名称也将知道其位置。

您要描述的是"action at a distance" anti-pattern,其中对程序一个部分的更改将更改程序的另一部分,而没有明显的联系。这违反了封装;好的封装使您仅通过查看系统的输入和输出就可以了解它的单个部分。违反封装意味着要了解系统的一部分,您必须了解导致维护噩梦的系统的每一部分。现代语言和实践都在努力避免这种情况。

例如,变量的名称与程序的行为无关。您应该能够安全地执行Rename Variable refactoring来根据对对象的用户有意义的名称来命名变量。在您的示例中,这会违反Principle of Least Astonishment来更改程序的行为。

相反,您将有一个对象来表示网格,这将管理网格中节点之间的关系。而不是绕过单个节点,而要绕过网格。

或者每个节点可以知道谁是其相邻节点。传统的TreeGraphLinked List结构就是一个例子。这里的优点是没有固定的位置,并且数据结构可以在任何方向上增长或收缩。任何节点都可以传递,并且知道其在结构中的位置。