Изменить значение элемента массива, на которое ссылается в цикле .each?
Как мне получить следующее: Я хочу изменить значение элемента массива, на который ссылаются между символами pipe в цикле .each
.
Вот пример того, что я хочу сделать, но в настоящее время не работает:
x = %w(hello there world)
x.each { |element|
if(element == "hello") {
element = "hi" # change "hello" to "hi"
}
}
puts x # output: [hi there world]
Трудно найти что-то такое общее.
Ответы
Ответ 1
Вы можете получить результат, который хотите использовать collect!
или map!
, чтобы изменить массив на месте:
x = %w(hello there world)
x.collect! { |element|
(element == "hello") ? "hi" : element
}
puts x
На каждой итерации элемент заменяется на массив значением, возвращаемым блоком.
Ответ 2
Метод each
никогда не изменяет объект, на котором он работает.
Вместо этого вы должны использовать метод map!
:
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]
Ответ 3
Карта, вероятно, лучший способ, но вы также можете изменить строку на месте.
> a = "hello"
> puts a
=> hello
> a.replace("hi")
> puts a
=> hi
изменяет внутреннее значение строки. Например, ваш код может стать:
x = %w(hello there world)
x.each { |e| if (e == "hello"); e.replace("hi") end; }
но это намного приятнее:
x = %w(hello there world)
x.map! { |e| e == "hello" ? "hi" : e }
Ответ 4
x = %w(hello there world)
x[index] = "hi" if index = x.index("hello")
x[index] = "hi" if index
или
x = %w(hello there world)
index = x.index("hello") and x[index] = "hi"
Но одно уведомление: оно заменит только первое совпадение. В противном случае используйте map!
как @SirDarlus
Также вы можете использовать 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
Но я все же предпочитаю использовать map!
:)
Ответ 5
У этого метода меньше строк кода:
x = %w(hello there world)
x = x.join(",").gsub("hello","hi").split(",")
puts x
Ответ 6
Как насчет просто:
x = %w(hello there world).map! { |e| e == "hello" ? "hi" : e }