0

我正在使用 ruby​​ 1.8.7 和 ruby​​ on rails 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}

只要确保我没有错过 ruby​​ 功能。

4

4 回答 4

1

如果sanitize_element!存在,您可以尝试这种方式:

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

我认为它看起来更清楚。

于 2011-03-10T19:44:00.983 回答
1

如果我正确理解你的问题,你可以写

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

以流利的方式。这是你的意思吗?

于 2011-03-10T19:10:31.043 回答
1

是的,通过使用Array#map!

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

通常,不可变方法 likemap与危险方法 like 配对map!,这会导致接收器被修改。我建议不要使用这些,因为好的、函数式可枚举编程的一半是为了获得不变性的好处(引用透明等)。但是,如果您要在每个枚举上重新分配,您不妨使用map!.

于 2011-03-10T19:11:24.320 回答
0

出于兴趣,请注意您可以不理会数组并专注于修改字符串本身。像这样:

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

在随机数据的快速基准测试中,这看起来像是多版本运行时间的 2/3 左右map!,但显然您希望在您的实际数据和操作上验证这一点。

于 2011-03-11T03:28:54.553 回答