代码之家  ›  专栏  ›  技术社区  ›  Mario Narcis Radoi

是否可以在Ruby中识别别名方法?

  •  12
  • Mario Narcis Radoi  · 技术社区  · 15 年前

    通常在控制台中,我会询问一个对象

    pp obj.methods.sort #or...
    pp (obj.methods - Object.methods).sort
    

    在Ruby中,开发人员为方法提供别名是很常见的。我想知道是否有一种反射式的方法来识别别名,以便我能够显示别名方法,比如…

    array.aliased_methods #=> {:collect => :map, ...}
    

    这将有助于确定一个对象可以做多少事情。

    2 回复  |  直到 13 年前
        1
  •  14
  •   Marc-André Lafortune    13 年前

    在Ruby1.9中,别名实例方法将 eql? ,因此您可以定义:

    class Module
      def aliased_methods
        instance_methods.group_by{|m| instance_method(m)}.
          map(&:last).keep_if{|symbols| symbols.length > 1}
      end
    end
    

    现在,如果你尝试一下,你会得到:

    class Foo
      def bar; 42 end
      alias baz bar
      def hello; 42 end
    end
    
    Foo.aliased_methods # => [[:bar, :baz]]
    
    Array.aliased_methods # => [[:inspect, :to_s], [:length, :size]]
    

    请注意,某些对丢失,例如 [:map, :collect] . 这是由于 bug that is now fixed 在下一个版本(2.0.0)中,如果它对你很重要,你可以自己滚动 group_by 不使用哈希或 EQL? 并且仅使用 == .

        2
  •  0
  •   Matt Briggs    15 年前

    不是真的。别名不仅仅是一个指针或类似的东西,在一个别名之后,您可以取消对第一个方法的定义,并且别名方法不会改变(想想硬链接和符号链接)。通常,别名会反映在RDOC中,所以我会去那里获取一个确定的列表。

    推荐文章