Подтвердить что ты не робот

Изменить значение элемента массива, на которое ссылается в цикле .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]

Трудно найти что-то такое общее.

4b9b3361

Ответ 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 }