独自のメソッドを追加するために Array にモンキー パッチを適用していArray#left_outer_join
ます。私は Ruby を初めて使用するので、かなりのことを行い、新しい配列を返すメソッドと、現在の配列を置き換える bang メソッドが必要です。しかし、私は同じコードを 2 回書いてしまい、非 bang メソッドと bang メソッドの唯一の違いは map または map への呼び出しです! それぞれ。
ブロックとメタプログラミングについて少し読んだところ、次のようになりました。
class Array
def left_outer_join_proc(method, ary, &block)
self.send(method) do |obj1|
ary.each do |obj2|
if yield obj1, obj2
obj2.keys.each do |key|
obj1[key] = obj2[key]
end
break
end
end
obj1
end
end
def left_outer_join(ary, &block)
left_outer_join_proc(:map, ary, &block)
end
def left_outer_join!(ary, &block)
left_outer_join_proc(:map!, ary, &block)
end
end
events.left_outer_join!(users) {|event, user| event['user_id'] == user['user_id'] }
これまでのところ、これは問題なく動作し、Object.send
(SO によると) メソッドを動的に呼び出すための最良の使用法であり、私はこのアプローチが好きです (私の純粋主義者はArray
、3 番目のメソッドでクラスを汚染することを嫌います)。
ここでの質問: 非 bang メソッドと bang メソッドの両方を定義して DRY に保つためのベスト プラクティスは何ですか?
編集: この質問は、「bang メソッドは破壊的なメソッドを意味しますか?」に関するものではありません。しかし、実際には「 and を書くArray#add_two
としたら、 を使用してメソッドを定義し、 を使用して別Array#add_two!
のメソッドを定義する必要がないようにするにはどうすればよいでしょうか。map{|x| x +2 }
map!{|x| x + 2 }
私は私が使用できることを知っています
def add_two!(x)
self = add_two(x)
end
しかし、私は「最高のパフォーマンス、最高の可読性」タイプの回答を求めています (ソースを見て、「微妙な」パフォーマンスの違いを確認してください) Array#map
。Array#map!