2010-04-14 3 views
3

Après avoir créé un tas de classes sérieuses (avec des méthodes initialize), je les charge dans IRb pour tester chacune d'entre elles. Je le fais en créant des instances simples et en appelant leurs méthodes pour apprendre leur comportement. Cependant parfois je ne me souviens pas exactement dans quel ordre j'étais supposé donner les arguments quand j'appelle la méthode .new sur la classe. Cela m'oblige à regarder en arrière le code. Cependant, je pense qu'il devrait être assez facile de retourner un message d'utilisation, au lieu de voir:Ruby Méthodes: comment retourner une chaîne d'utilisation quand les arguments sont insuffisants

ArgumentError: wrong number of arguments (0 for 9) 

donc je préfère retourner une chaîne avec les arguments lisibles par l'homme, par exemple en utilisant « met » ou juste un retour de un string. Maintenant, j'ai vu le mot-clé rescue dans le code begin-end, mais je me demande comment je pourrais attraper l'ArgumentError lorsque la méthode initialize est appelée.

Merci pour vos réponses, vos commentaires et vos commentaires!

+0

Mes sincères excuses si mes questions sont difficiles à lire, l'anglais n'est pas ma langue maternelle. – Shyam

+0

Votre anglais dans cette question allait bien. Pas de problèmes pour le comprendre. – mikej

Répondre

4

Il est possible de se connecter à la création d'objet en remplaçant la méthode Class#new par ex.

class Class 
    # alias the original 'new' method before overriding it 
    alias_method :old_new, :new 
    def new(*args) 
    return old_new(*args) 
    rescue ArgumentError => ae   
     if respond_to?(:usage) 
     raise ArgumentError.new(usage) 
     else 
     raise ae 
     end 
    end 
end 

Cette méthode surchargée appelle la méthode new normale mais les prises ArgumentError et si la classe de l'objet créé fournit une méthode usage alors il soulèvera un ArgumentError avec le message d'utilisation sinon il reraise la ArgumentError originale.

Voici un exemple en action. Définir une Person classe:

class Person 
    def initialize(name, age) 
    end 

    def self.usage 
    "Person.new should be called with 2 arguments: name and age" 
    end 
end 

puis essayer de instancier sans les arguments requis:

irb(main):019:0> p = Person.new 
ArgumentError: Person.new should be called with 2 arguments: name and age 
    from (irb):8:in `new' 
    from (irb):22 

Remarque: ce n'est pas parfait. Le problème principal étant qu'il est possible que le ArgumentError que nous attrapions ait été causé par quelque chose d'autre qu'un nombre incorrect d'arguments passés à initialize qui conduirait à un message trompeur. Cependant, il devrait faire ce que vous voulez dans la plupart des cas.

+0

J'aime les deux réponses, surtout que je sais que vous pouvez remplacer le nouveau constructeur de méthode/classe. Cependant, le second est clairement assez simpliste pour répondre à mes besoins. Merci beaucoup! – Shyam

Questions connexes