Перечисление на месте - PullRequest
0 голосов
/ 10 марта 2011

Я использую ruby ​​1.8.7 и ruby ​​на рельсах 3.x.У меня есть много строк, подобных этому

lines = lines.map {|e| e.strip}
lines = lines.map {|e| e.upcase}
lines = lines.map {|e| sanitize_element(e)}

Вместо того, чтобы каждый раз присваивать новые значения строкам, есть лучший способ справиться с этим.Я знаю, что могу сделать

lines = lines.map {|e| sanitize_element(e.strip.upcase) }

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

По сути, я ищу такое элегантное решение, но я знаю, чтоmap! в Enumerable.

lines.map! {|e| e.strip}

Просто убедитесь, что я не пропускаю рубиновую функцию.

Ответы [ 4 ]

1 голос
/ 10 марта 2011

Да, с помощью Array#map!:

lines.map! { |e| e.strip }
lines.map! { |e| e.upcase}
# ...

Часто неизменяемый метод, такой как map, соединяется с опасным, например map!, что приводит к модификации приемника.Я рекомендую не использовать их, так как половина смысла хорошего перечислимого программирования в функциональном стиле состоит в том, чтобы получить преимущества неизменности (ссылочная прозрачность и т. Д.).Но если вы собираетесь переназначать каждое перечисление, вы также можете использовать map!.

1 голос
/ 10 марта 2011

В случае, если sanitize_element! существует, вы можете попробовать это следующим образом:

lines.map! do |e|
  e.strip
  e.upcase
  e.sanitize_element
end

Я думаю, это выглядит более понятным.

1 голос
/ 10 марта 2011

Если я правильно понимаю ваш вопрос, вы можете написать

lines = lines.map {|e| e.strip}.map {|e| e.upcase}.map {|e| sanitize_element(e)}

бегло. Это то, что вы имели в виду?

0 голосов
/ 11 марта 2011

Для интереса, обратите внимание, что вы можете оставить массив в покое и сосредоточиться на изменении самих строк. Как это:

lines.each do |e|
  e.strip!
  e.upcase!
  e.replace(e.sanitize_element)
end

В быстром бенчмарке для случайных данных это выглядело так, как если бы оно работало примерно в 2/3 раза по сравнению с многократной версией map!, хотя, очевидно, вы захотите проверить это на реальных данных и операциях.

...