58 votes

rubis super mot-clé

D'après ce que j'ai compris, le mot clé super appelle une méthode portant le même nom que la méthode actuelle dans la superclasse de la classe actuelle. Ci-dessous, dans la méthode autoload , il existe un appel à super . Je voudrais savoir dans quelle classe de classe je trouverais une méthode portant le même nom ou que fait l'appel à super ici

 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
 

Ce code provient de la branche des rails maîtres. Merci beaucoup.

45voto

maček Points 25640

J'ai lié à cela dans mon autre réponse mais quelque chose me dit que vous ne l'avez pas regardée.

L'exemple fourni dans les documents Ruby pour le mot clé 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
 

Inspection des ancêtres

 puts Car.ancestors.inspect

# Output
# [Car, Vehicle, Vehicular, Object, Kernel, BasicObject]
 

Notez l'inclusion de l'objet Vehicular Module !

16voto

Gishu Points 59012

Vérifiez objRef.class.ancestors ou ClassName.ancestors à savoir la chaîne d'héritage. Si la super-classe ne contient pas la méthode, puis tous les modules inclus par la super-classe sont vérifiées (dernière inclus vérifié en premier). Si pas de match, puis il se déplace au niveau des grands-parents de la classe et ainsi de suite.
Vous pouvez utiliser la liste des ancêtres et puis appelez AncestorClass.methods.select{|m| m.include?("auto_load")} de zone de sur la méthode qui est appelée.

(Note: le code ci-dessus est Ruby 1.8. Dans 1,9 methods rendements des symboles à la place de chaînes de caractères. de sorte que vous avez à faire un m.to_s.include?(...)

14voto

banister Points 13181

Utiliser un levier

Insérez un appel binding.pry juste avant d’utiliser super , puis appelez show-source -s ( -s signifie superclass ) pour affiche la méthode superclass et découvre où elle est définie:

 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 (i.e superclass)
Visibility: public

def hello
  puts "hi"
end
[2] (pry) #<B>: 0>    
 

5voto

maček Points 25640

L' super mot-clé vérifie tout le chemin jusqu'à l'ancêtre de l'arbre afin de trouver la méthode héritée.

Faire une recherche sur l'ensemble des rails de la branche principale. Vous ne trouverez qu'un seul def autoload - ce qui est exactement celui que vous êtes en train de regarder en active_support/lib/active_support/dependencies/autoload.rb.

La méthode de remplacement est originaire de Rubis. C'est - Module#autoload

1voto

Greg Campbell Points 10321

La méthode pertinente de la super-classe est probablement Module # autoload .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X