代码之家  ›  专栏  ›  技术社区  ›  Nathan Long

红宝石-确定方法起源?

  •  27
  • Nathan Long  · 技术社区  · 14 年前

    1. 定义在自身上的单例方法(也称为“特征类”上的方法)
    2. 在其类中定义的方法
    3. 按包含的相反顺序混合到其类中的任何模块(只有给定模块的最早包含才有任何效果-如果超类包含模块a,而子类再次包含模块a,则在子类中忽略它;如果子类包含a,则B,然后a,则忽略第二个a)( 更新 :请注意,这是以前写的 Module.prepend
    4. 任何混入父类、父类的父类等的方法。

    或者,更简单地说,它看着自己,然后看着里面的一切 self.class.ancestors

    在调用方法时遵循此查找路径;如果您创建一个类的实例,然后重新打开该类并添加一个方法或通过模块将一个方法混合在一起,则现有实例将获得对该方法的访问权。

    method_missing 方法,或者如果它的类有,它的父类,等等。

    我的问题是: 除了手工检查代码,或者使用类似 puts "I'm on module A!" ,你能说出一个给定的方法是从哪里来的吗?

    4 回复  |  直到 8 年前
        1
  •  25
  •   Nathan Long    12 年前

    Object#method 返回一个 Method 对象提供有关给定方法的元数据。例如:

    > [].method(:length).inspect
    => "#<Method: Array#length>"
    > [].method(:max).inspect
    => "#<Method: Array(Enumerable)#max>"
    

    Method#owner 以确定定义该方法的类或模块。

    obj.methods.collect {|m| "#{m} defined by #{obj.method(m).owner}"}
    
        2
  •  9
  •   Chuck    14 年前

    获取适当的Method(或UnboundMethod)对象并请求其 owner . 所以你可以 method(:puts).owner 然后得到 Kernel .

        3
  •  5
  •   horseyguy    4 年前

    查找在上定义了哪些实例方法 A

    A.instance_methods(false)
    

    查找在上定义了哪些实例方法 A

    A.instance_methods
    

    要查找给定方法在哪个类(或模块)上定义,请执行以下操作:

    method(:my_method).owner
    

    method(:my_method).receiver
    
        4
  •  1
  •   sluukkonen    14 年前

    你可以用 Object#method . 例如,

    [1, 2, 3].method(:each_cons) # => #<Method: Array(Enumerable)#each_cons>
    

    说明数组的每个\u cons方法来自可枚举模块。