【问题标题】:Can I get the variable name from it's assignee?我可以从它的受让人那里得到变量名吗?
【发布时间】:2019-03-06 22:40:55
【问题描述】:

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

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

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

【问题讨论】:

  • 这可能对stackoverflow.com/questions/2603617/… 有帮助,但我想不出一个好的用例,你为什么需要这种行为?
  • 没有。考虑:THAT = cat = dog = OWL = THIS = Test.new。分配了Test.new 的常量或变量的名称是什么?这不仅限于实例;它适用于所有 Ruby 对象。
  • 我寻找这种行为的原因是使用变量名作为名称以及数据网格中的位置。因此,如果有一个变量名称的二维网格,如“AA”、“AB”、“BC”等。它可以知道它的名字,它也知道它的位置。有很多方法可以让我在课堂上获得职位,但我很好奇是否有一个我还不知道的有趣的 Rubyism。
  • 您的示例与您的文本不匹配。 THIS 不是变量,是常量。
  • 此外,THISTest 的一个实例。它不是一门课。 who_am_I_assinged_to 不是类方法。

标签: ruby


【解决方案1】:

技术上是的,有点。

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

不要那样做。

我寻找这种行为的原因是使用变量名,但也作为数据网格中的一个位置。因此,如果有一个二维网格,变量名称将类似于“AA”、“AB”、“BC”等。它知道它的名称,它也知道它的位置。

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

例如,变量的名称对程序的行为不应该有任何影响。您应该能够安全地执行Rename Variable refactoring 以根据对对象用户有意义的方式命名变量。在您的示例中,这将改变违反 Principle of Least Astonishment 的程序的行为。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2018-03-20
    • 2011-12-29
    • 2017-06-18
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多