Erreur alors que mon objet possède bien l'attribut

Une erreur de ma part, mais impossible de savoir

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,
Je suis actuellement dans l'exercice du Javaquarium. Seulement j'ai cette méthode de ma classe Fish qui plante :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def sex(aquarium)
    random_fish = Random.rand(0..aquarium.fish_ary.count)

    n_fish = aquarium.fish_ary[random_fish]

    puts n_fish # Le plus étonnant c'est que cette ligne n'affiche rien...

    if @species == n_fish.species && Random.rand(1..2) == 2
      if @species == :clown || @species == :sole
        r = random_sex
        puts "Un nouveau bébé ! Quel est son nom ?"
        print '>> '
        user_name_baby = gets.chomp.capitalize

        aquarium.fish_baby << Fish.new(user_name_baby, 0, @species, r)
        @nb_sex += 1
        n_fish.nb_sex += 1
      elsif @gender != n_fish.gender
        r = random_sex
        if @gender == :carpe || @gender == :thon
          puts "Un nouveau bébé ! C'est #{ r == :male ? "un male" : "une femelle"}. Quel est son nom ?"
        else
          puts "Un nouveau bébé ! Quel est son nom ?"
        end
        print '>> '
        user_name_baby = gets.chomp.capitalize

        aquarium.fish_baby << Fish.new(user_name_baby, 0, @species, r)
        @nb_sex += 1
        n_fish.nb_sex += 1
      end
    end
end

Cette méthode prend comme argument un aquarium qui contient un attribut @fish_ary qui est un array contenant tous les poissons en vie afin de les faire se reproduire.
Seulement voici l'erreur que j'obtient :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
/home/louis/Documents/Lab/ruby/aquarium/Fish.rb:87:in `sex': undefined method `species' for nil:NilClass (NoMethodError)
    from /home/louis/Documents/Lab/ruby/aquarium/Aquarium.rb:135:in `block in new_turn'
    from /home/louis/Documents/Lab/ruby/aquarium/Aquarium.rb:126:in `each'
    from /home/louis/Documents/Lab/ruby/aquarium/Aquarium.rb:126:in `new_turn'
    from main.rb:74:in `simulate'
    from main.rb:80:in `simulate'
    from main.rb:80:in `simulate'
    from main.rb:80:in `simulate'
    from main.rb:80:in `simulate'
    from main.rb:80:in `simulate'
    from main.rb:80:in `simulate'
    from main.rb:80:in `simulate'
    from main.rb:32:in `main_menu'
    from main.rb:83:in `<main>'

Je vous ai mis en fluo la ligne qui pose problème. Il semblerais que l'attribut @species ne soit pas accessible mais pourtant j'ai bien dans mon code un attr_accessor :species

Le code entier est ici : https://github.com/boopr/Javaquarium
Merci de votre aide!

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0

n_fish vaut nil, tout simplement.

Essaie avec

1
random_fish = Random.rand(0..(aquarium.fish_ary.count - 1))

Si ça ne marche pas, essaie avec

1
2
rng = Random.new
random_fish = rng.rand(0..(aquarium.fish_ary.count - 1))

Et accessoirement, verifie que ton poisson ne fasse pas l'amour avec lui même, ce genre de chose n'entraine jamais de bébé ^^

+0 -0

Cette réponse a aidé l'auteur du sujet

En effet, 0..3 c'est de 0 à 3, tous deux inclus. Ce qui pourrait produire cette erreur si c'est la valeur de aquarium.fish_ary.count qui est tirée puisqu'on se retrouverait hors tableau (donc on récupère la valeur nil).

Pour exclure la borne supérieure, il y a même l'"opérateur" ..., ce qui permettrait d'écrire simplement 0...aquarium.fish_ary.count.

Le plus étonnant c'est que cette ligne n'affiche rien…

Pas tellement : la méthode to_s de nil renvoyant la chaîne vide (même chose en PHP, lors de la cast de NULL en string, par exemple).

Édité par vibrice

+0 -0
Auteur du sujet

Merci de votre aide, les ... ont corrigés le tir ! Je pensais que c'était les 2 points pour exclure et les 3 points pour inclure moi! Du coup faut que j'aille changer tous mes points :(
Merci encore !

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte