Comment puis-je obtenir ce qui suit se produire: Je veux modifier la valeur d'un élément de tableau qui est référencé entre les caractères de canal dans un .each
boucle.
Voici un exemple de ce que je veux faire, mais ne fonctionne pas actuellement:
x = %w(hello there world)
x.each { |element|
if(element == "hello") {
element = "hi" # change "hello" to "hi"
}
}
puts x # output: [hi there world]
Il est difficile de rechercher quelque chose d'aussi général.
Vous pouvez obtenir le résultat souhaité en utilisant collect!
ou map!
pour modifier le tableau sur place:
x = %w(hello there world)
x.collect! { |element|
(element == "hello") ? "hi" : element
}
puts x
À chaque itération, l'élément est remplacé dans le tableau par la valeur renvoyée par le bloc.
La méthode each
ne modifie jamais l'objet sur lequel elle fonctionne.
Tu devrais utiliser map!
méthode à la place:
x = %w(hello there world)
x.map! { |element|
if(element == "hello")
"hi" # change "hello" to "hi"
else
element
end
}
puts x # output: [hi there world]
La carte est probablement le meilleur moyen, mais vous pouvez également modifier la chaîne sur place.
> a = "hello"
> puts a
=> hello
> a.replace("hi")
> puts a
=> hi
modifie la valeur interne de la chaîne. Par exemple, votre code pourrait devenir:
x = %w(hello there world)
x.each { |e| if (e == "hello"); e.replace("hi") end; }
mais c'est bien mieux:
x = %w(hello there world)
x.map! { |e| e == "hello" ? "hi" : e }
x = %w(hello there world)
x[index] = "hi" if index = x.index("hello")
x[index] = "hi" if index
ou
x = %w(hello there world)
index = x.index("hello") and x[index] = "hi"
Mais une remarque: il ne remplacera que le premier match. Sinon, utilisez map!
comme @SirDarlus suggéré
Vous pouvez également utiliser each_with_index
x.each_with_index do |element, index|
x[index] = "hi" if element == "hello" # or x[index].replace("hi") if element == "hello"
end
Mais je préfère toujours utiliser map!
:)
Que diriez-vous simplement:
x = %w(hello there world).map! { |e| e == "hello" ? "hi" : e }
C'est une façon qui a moins de lignes de code:
x = %w(hello there world)
x = x.join(",").gsub("hello","hi").split(",")
puts x