Il y a un certain nombre de problèmes avec votre code. Passons un par un.
De la documentation,
method_missing(*args) private Invoked by Ruby when obj is sent a message it cannot handle.
Ici message
fait référence à la method
. Dans ruby, chaque fois que vous appelez une méthode sur un objet, vous êtes en réalité send
et object
Pour mieux comprendre cela, essayez ceci dans le shell irb.
1+2
=> 3
1.send(:+,2)
=> 3
Ici 1 et 2 sont des objets de la classe Fixnum
. Vous pouvez le confirmer en utilisant 1.class
. Ok, revenons à votre question. Ainsi, une méthode method_missing
doit être appelée sur une instance.
team = Team.new
team.hawks
Si vous essayez la pièce au-dessus de code, vous obtiendrez une erreur en disant 'fetch': key not found: :roster (KeyError)
Vous pouvez contourner ce problème en passant un default value
comme second paramètre à la méthode fetch
. Remplacez votre méthode initialize
avec
def initialize(stats = {})
@cust_roster = stats.fetch(:roster, [])
@cust_total_per = stats.fetch(:per, 0)
@cust_name = stats.fetch(:name, "anon")
@cust_best_player = stats.fetch(:best, "anon")
@@teams << self
fin
Si vous exécutez le script, vous obtiendrez un stack level too deep (SystemStackError)
à cause d'une faute de frappe dans cette petite ligne.
str = methID.id2name
Dans la définition de la méthode, vous recevez un argument avec le nom de methId
mais à l'intérieur vous essayez d'appeler methID
. Fixez avec
str = methId.id2name
Si vous exécutez votre script, vous obtenez une erreur de nouveau en disant undefined method uppercase for "hawks":String (NoMethodError)
Ceci est parce qu'il n'y a pas de méthode uppercase
sur les chaînes. Vous devriez plutôt utiliser la méthode upcase
.
Team.new(roster:[], per: 0, name: str.upcase, best: 0)
et vous devriez être prêt à partir.
Pour plus, voir http://apidock.com/ruby/BasicObject/method_missing
Hope this helps!
Vous ne voulez pas dire 'hawks = Team.new.hawks'? 'Team.hawks' tente d'invoquer la méthode de classe inexistante' hawks'. –
Ou peut-être 'def self.method_missing'? – ScottJ
non cela ne fonctionne pas et puisque Team.new est déjà une fonction, il ne fonctionnera pas method_missing –