Le contenu de ma variable à disparu

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

Bonjour !
J'essaye depuis peu de me remettre un peu à Ruby qui est vraiment un langage magnifique. Mais parfois il y a quelque logique que je ne comprend pas… Voyez mon code :

 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
34
35
36
37
38
39
# encoding: utf-8
# FONCTIONS

# Fonction pour mélanger les lettres d'un mot
def randomizer(word)
    base_word = word
    random_word = ''

    until word.size == 0
        position = Random.rand(0...word.size)
        random_word << word[position] # On ajoute la lettre

        word.slice!(position) # On supprime les lettres au fur et à mesure
    end

    # On vérifie que ce ne soit pas le même mot
    randomizer(base_word) if (random_word == base_word)

    random_word # On retourne le mot mélangé
end

# MAIN

print 'Entrez un mot : '
base_word = gets.chomp # Mot qui va être mélangé

random_word = randomizer(base_word)

user_try = nil

while user_try != base_word
    puts "Devinez le mot : #{random_word.upcase}"
    puts base_word # N'AFFICHE RIEN !
    user_try = gets.chomp

    puts "\n" if user_try != base_word
end

puts 'end'

Je vous ai mis en évidence la ligne qui m'a mit la puce à l'oreille. Mon puts n'affiche rien, le contenu de ma variable à disparu ! Serais-ce la fonction qui travaille directement sur celle-ci au lieu de la copier ?

Merci de votre aide !

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

+0 -0

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

Je ne connais pas Ruby, mais je pense que c'est dû à une référence :

  • Ligne 25, Ruby va mettre la chaîne de caractère dans une case mémoire ;
  • Ligne 27, il passe l'adresse de la case mémoire (et non son contenu) à la fonction ;
  • Ligne 13, tu modifies le contenu de la case mémoire désignée par word, c'est-à-dire la "variable" de la ligne 25.

http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value

+0 -0
Auteur du sujet

Merci de vos réponses.

J'avais totalement oublié que quand une fonction terminait par un ! signifie qu'elle travaille directement sur le mot, merci du rappel!

Et Vayel, ton lien m'a été fortement utile pour voir comment Ruby effectue l'affectation de variable. C'était la méthode string.dup qui me fallait afin de copier le contenu et pas son adresse (afin que les deux variables ne pointent pas sur la même valeur.

Du coup, merci encore et voici mon code final (je pense :D ) !

 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
34
35
36
37
38
# encoding: utf-8
# FONCTIONS

# Fonction pour mélanger les lettres d'un mot
def randomizer(word)
    original_word = word
    random_word = ''

    until word.size == 0
        position = Random.rand(0...word.size)
        random_word << word[position] # On ajoute la lettre

        word.slice!(position) # On supprime les lettres au fur et à mesure
    end

    # On vérifie que ce ne soit pas le même mot
    randomizer(original_word) if (random_word == original_word)

    random_word # On retourne le mot mélangé
end

# MAIN

print 'Entrez un mot : '
base_word = gets.chomp # Mot qui va être mélangé

# On envoie le contenu de la variable avec la méthode "dup"
random_word = randomizer(base_word.dup)
user_try = nil

while user_try != base_word
    puts "Devinez le mot : #{random_word.upcase}"
    user_try = gets.chomp

    puts "\n" if user_try != base_word
end

puts 'end'

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