ruby超级关键字

据我所知, super关键字在当前类的超类中调用与当前方法同名的方法。 在autoload方法下面,有一个super调用。 我想知道在哪个超类中,我会find一个名称相同的方法,或者在这里调用super

 module ActiveSupport module Autoload ... def autoload(const_name, path = @@at_path) full = [self.name, @@under_path, const_name.to_s, path].compact.join("::") location = path || Inflector.underscore(full) if @@eager_autoload @@autoloads[const_name] = location end super const_name, location end .... end end module ActiveRecord extend ActiveSupport::Autoload ... autoload :TestCase autoload :TestFixtures, 'active_record/fixtures' end 

这段代码来自rails master分支。 非常感谢。

Ruby文档中为super关键字提供的示例:

 module Vehicular def move_forward(n) @position += n end end class Vehicle include Vehicular # Adds Vehicular to the lookup path end class Car < Vehicle def move_forward(n) puts "Vrooom!" super # Calls Vehicular#move_forward end end 

检查祖先

 puts Car.ancestors.inspect # Output # [Car, Vehicle, Vehicular, Object, Kernel, BasicObject] 

注意包含Vehicular Module对象!

检查objRef.class.ancestorsClassName.ancestors以了解inheritance链。 如果超类没有包含该方法,则检查超类所包含的所有模块(最后包括首先检查)。 如果不匹配,那么它会升级到祖父母级,等等。
你可以使用祖先列表,然后调用AncestorClass.methods.select{|m| m.include?("auto_load")} AncestorClass.methods.select{|m| m.include?("auto_load")}来调用正在调用的方法。

(注意:上面的代码是Ruby m.to_s.include?(... methods返回符号而不是string,所以你必须做一个m.to_s.include?(...

使用撬

在使用super之前插入一个binding.pry调用,然后调用show-source -s-s表示superclass )来显示超类方法,并找出它的定义位置:

 class A def hello puts "hi" end end class B < A def hello binding.pry super end end b = B.new b.hello From: (pry) @ line 7 B#hello: 7: def hello => 8: binding.pry 9: super 10: end [1] (pry) #<B>: 0> show-source -s From: (pry) @ line 2: Number of lines: 3 Owner: A # <--see owner here (ie superclass) Visibility: public def hello puts "hi" end [2] (pry) #<B>: 0> 

super关键字检查祖先树,findinheritance的方法。

在整个rails主分支上进行search。 你只能在active_support/lib/active_support/dependencies/autoload.rbfind一个def autoload active_support/lib/active_support/dependencies/autoload.rb

被覆盖的方法是本地Ruby。 它是Module#autoload

我添加了这个方法来find我的.irbrc方法的所有者,有没有人看到更好的方法来做到这一点,特别是在处理单例类的超类是超类的单例类的单例方法?

  class Object def find_method(method_string) if klasses = self.class.ancestors.select { |a| a if a.methods.include? method_string } puts "class method in #{klasses.join(',')}" unless klasses.empty? end if klasses = self.class.ancestors.select { |a| a if a.instance_methods.include? method_string } puts "instance method in #{klasses.join(',')}" unless klasses.empty? end rescue raise "owning class not found" end end 

相关的超类方法可能是Module#autoload 。