Ruby Language Définition dynamique de méthodes


Exemple

Avec Ruby, vous pouvez modifier la structure du programme en temps d'exécution. Une façon de le faire est de définir des méthodes dynamiquement en utilisant la méthode method_missing .

Disons que nous voulons pouvoir tester si un nombre est supérieur à un autre nombre avec la syntaxe 777.is_greater_than_123? .

# open Numeric class
class Numeric
  # override `method_missing`
  def method_missing(method_name,*args)
    # test if the method_name matches the syntax we want
    if method_name.to_s.match /^is_greater_than_(\d+)\?$/
      # capture the number in the method_name
      the_other_number = $1.to_i
      # return whether the number is greater than the other number or not
      self > the_other_number
    else
      # if the method_name doesn't match what we want, let the previous definition of `method_missing` handle it
      super
    end
  end
end

Une chose importante à retenir lors de l’utilisation de method_missing que vous method_missing également remplacer respond_to? méthode:

class Numeric
   def respond_to?(method_name, include_all = false) 
     method_name.to_s.match(/^is_greater_than_(\d+)\?$/) || super
   end
end

Oublier de le faire conduit à une situation incohérente lorsque vous pouvez appeler 600.is_greater_than_123 avec succès, mais que 600.respond_to(:is_greater_than_123) renvoie false.