Le contenu de ma variable à disparu
Le problème exposé dans ce sujet a été résolu.
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 !
Salut,
Quand tu fais word.slice!
en ligne 13, du modifies de fait ta variable (le !
devrait te mettre la puce à l'oreille). Donc oui, une solution serait de dupliquer ta chaîne au début de la fonction.
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
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
) !
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'
|
Tu reproduis le même problème dans ta fonction : original_word
et word
référencent le même objet, quand tu en modifies un (slice!
), tu modifies l'autre.
Ainsi, tes deux variables ne pourront jamais être différentes.
Oups petit oubli de ma part ! Merci 
Connectez-vous pour pouvoir poster un message.
Connexion
Pas encore membre ?
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