2010-08-21 2 views
2

n'est pas + un opérateur? pourquoi ne serait-il pas défini?Pourquoi est-ce que j'obtiens "méthode non définie '+' pour nil: NilClass"?

voici mon code:

Class Song 
    @@plays = 0 
    def initialize(name, artist, duration) 
    @name = name 
    @artist = artist 
    @duration = duration 
    @plays = 0 
    end 
    attr_reader :name, :artist, :duration, 
    attr_writer :name, :aritist, :duration 
    def play 
    @plays += 1 
    @@plays += 1 
    "This Song: #@plays play(s). Total #@@plays plays." 
    end 
    def to_s 
    "Song: #@name--#@artist (#@duration)" 
    end 
end 
+3

line, stacktrace ... – clyfe

+0

Non corrélé, mais je recommande de ne pas utiliser une variable de classe et d'instance avec le même nom; nommez plutôt la variable de classe '@@ total_plays' ou quelque chose comme ça. Juste trop facile de faire une erreur autrement. –

Répondre

4

Tout d'abord, ce code ne court même pas: class sur la ligne 1 doit être écrit avec un c minuscule, et vous ne pouvez pas avoir une virgule après le dernier élément dans une déclaration (votre ligne attr_reader). Je ne reçois pas un NoMethodError après avoir réparé ceux-ci et en cours d'exécution Song.new ou Song#play ou Song#to_s.

Quoi qu'il en soit, vous obtiendrez toujours que NoMethodError lorsque vous essayez d'ajouter quoi que ce soit à une valeur nil:

>> nil + 1 
NoMethodError: undefined method `+' for nil:NilClass 
    from (irb):1 
>> nil + nil 
NoMethodError: undefined method `+' for nil:NilClass 
    from (irb):2 
>> # @foo is not defined, so it will default to nil 
?> @foo + 2 
NoMethodError: undefined method `+' for nil:NilClass 
    from (irb):4 

Vous pourriez essayer d'ajouter quelque chose à une variable d'instance non initialisée ... ou il pourrait être n'importe quoi. Vous devez toujours publier un code complet et minimal pour dupliquer une erreur si vous voulez être aidé correctement.

3

+ est défini sur les nombres (entre autres). Toutefois, comme le message d'erreur indique, il n'est pas défini sur nil. Cela signifie que vous ne pouvez pas faire nil + something et pourquoi le feriez-vous?

Cela étant dit, vous êtes en train de ne pas appeler nil + something partout dans le code que vous avez montré (vous à la fois l'initialisation @plays et @@plays-0, et vous n'êtes pas les mettre à nil à tout moment). Et en fait, votre code fonctionne très bien une fois que vous supprimez les deux erreurs de syntaxe (Class devrait être class et il ne devrait pas y avoir de virgule après :duration). Donc, l'erreur n'est pas dans le code que vous avez montré.

0

peut-être vous devriez inclure @@plays = 0 dans votre méthode d'initialisation?

+0

Pourquoi? C'est une variable de classe initialisée à 0 lors de la déclaration. –

Questions connexes