0

私はruby1.8.7とrubyonrails3.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

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}
# ...

多くの場合、のような不変のメソッドは、のmapような危険なメソッドとペアにmap!なり、レシーバーが変更されます。優れた機能スタイルの列挙可能なプログラミングの半分のポイントは、不変性(参照透過性など)の利点を得ることであるため、これらを使用しないことをお勧めします。ただし、列挙ごとに再割り当てする場合は、を使用することをお勧めしますmap!

于 2011-03-10T19:11:24.320 に答える
0

For interest, note that you could leave the array alone and concentrate on modifying the strings themselves. Like this:

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

In a quick benchmark on random data this looked like it ran in about 2/3rds the time of the multiple-map! version, although obviously you'd want to verify this on your actual data and operations.

于 2011-03-11T03:28:54.553 に答える