Изменить значение элемента массива, на который ссылается цикл .each? - PullRequest
37 голосов
/ 13 апреля 2011

Как получить следующее: я хочу изменить значение элемента массива, на который ссылаются символы канала в цикле .each.

Вот пример того, что я хочу сделать, но в настоящее время не работает:

x = %w(hello there world)
x.each { |element|
   if(element == "hello") {
       element = "hi" # change "hello" to "hi"
   }
}
puts x # output: [hi there world]

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

Ответы [ 6 ]

36 голосов
/ 13 апреля 2011

Вы можете получить желаемый результат, используя collect! или map! для изменения массива на месте:

x = %w(hello there world)
x.collect! { |element|
  (element == "hello") ? "hi" : element
}
puts x

На каждой итерации элемент заменяется на массив возвращаемым значениемрядом с блоком.

26 голосов
/ 13 апреля 2011

Метод 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]
9 голосов
/ 13 апреля 2011

Карта, вероятно, лучший способ, но вы также можете изменить строку на месте.

> 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 }
3 голосов
/ 13 апреля 2011
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!:)

1 голос
/ 27 июня 2015

Как насчет просто:

x = %w(hello there world).map! { |e| e == "hello" ? "hi" : e }
1 голос
/ 06 декабря 2012

Этот способ имеет меньше строк кода:

  x = %w(hello there world)
  x = x.join(",").gsub("hello","hi").split(",")
  puts x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...