Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-确定方法起源?_Ruby - Fatal编程技术网

Ruby-确定方法起源?

Ruby-确定方法起源?,ruby,Ruby,当发送一条消息时,Ruby对象会进行搜索,以查看是否有该名称的方法可以响应。它的方法查找按以下顺序搜索,并使用找到的第一个方法 定义在自身上的单例方法(也称为“特征类”上的方法) 在其类中定义的方法 以包含的相反顺序混合到其类中的任何模块(只有给定模块的最早包含才有任何效果-如果超类包含模块a,子类再次包含模块a,则在子类中忽略它;如果子类包含a,则B,然后a,则忽略第二个a)(更新:请注意,这是在模块.prepend存在之前编写的) 它的父类 任何混入父类、父类的父类等的方法 或者,更简单地说

当发送一条消息时,Ruby对象会进行搜索,以查看是否有该名称的方法可以响应。它的方法查找按以下顺序搜索,并使用找到的第一个方法

  • 定义在自身上的单例方法(也称为“特征类”上的方法)
  • 在其类中定义的方法
  • 以包含的相反顺序混合到其类中的任何模块(只有给定模块的最早包含才有任何效果-如果超类包含模块a,子类再次包含模块a,则在子类中忽略它;如果子类包含a,则B,然后a,则忽略第二个a)(更新:请注意,这是在
    模块.prepend
    存在之前编写的)
  • 它的父类
  • 任何混入父类、父类的父类等的方法
  • 或者,更简单地说,它自己看,然后按列出的顺序看
    self.class.祖先中的所有东西。

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

    如果所有这些都失败了,它将查看是否缺少
    方法
    方法,或者它的类是否缺少,父类是否缺少,等等


    我的问题是:除了手工检查代码,或者使用示例方法,如
    放置“我在模块A上!”
    ,您能告诉给定的方法来自哪里吗?
    例如,您能列出一个对象的方法并查看吗“这一个在父类上,这一个在模块A上,这一个在类上并重写父类,”等等?

    获取适当的方法(或UnboundMethod)对象并请求其
    所有者
    。这样您就可以执行
    方法(:put).owner
    和get
    内核

    返回一个对象,该对象给出了给定方法的元数据。例如:

    > [].method(:length).inspect
    => "#<Method: Array#length>"
    > [].method(:max).inspect
    => "#<Method: Array(Enumerable)#max>"
    
    您可以使用
    Object\method
    。例如

    [1, 2, 3].method(:each_cons) # => #<Method: Array(Enumerable)#each_cons>
    
    [1,2,3]。方法(:每个参数)#
    

    告诉数组的每个方法都来自可枚举模块。

    要查找在
    A
    上定义了哪些实例方法(但不在超类上),请执行以下操作:


    要查找
    A
    及其超类上定义了哪些实例方法,请执行以下操作:

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

    method(:my_method).owner
    
    要查找给定方法的接收器是哪个对象,请执行以下操作:

    method(:my_method).receiver
    

    通过使用backports gem,您可以在1.8.6中获得#owner方法。另一个惊人之处是:
    method
    对象也有一个
    source\u location
    方法。“现在那个讨厌的猴子补丁在哪里?”真不敢相信我对此一无所知。太有用了!非常感谢。要获取特定类型的方法:someobject.private\u方法,someobject.public\u方法,someobject.protected\u方法,someobject.singleton\u方法,SomeClass.instance\u方法,SomeClass.private\u实例\u方法,SomeClass.protected\u实例\u方法,SomeClass.public\u实例\u方法(与just.instance_方法相同)。情况似乎并非如此(请参阅)。或者,如果是的话,在某些非常不明显的方面是真的。@DavidMoles你是对的,应该是
    instance\u methods
    而不是
    methods
    ,我更新了我的答案。谢谢!你的答案和接受的答案都是黑暗中的光明,伙计。谢谢!
    method(:my_method).receiver