02 September 2013
ええ、ハッキリ言います。私はRubyのArray#unshiftが嫌いです。
Rubyで配列に要素を追加する場合は、通常Array#push
または#<<
を使います。
numbers = [3, 4, 5]
numbers.push(6, 7, 8) # => [3, 4, 5, 6, 7, 8]
numbers << 9
numbers # => [3, 4, 5, 6, 7, 8, 9]
でも、時として要素を配列の先頭に追加したいことがあります。この場合は、Array#unshift
を使います。
numbers.unshift(0, 1, 2)
numbers # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
オブジェクト指向の宿命でしょうが、「左側に追加されるもの」が「右側に置かれる」この構文はハッキリ言ってイケテません。
ええ、私はArray#unshift
が好きになれません。
で、私、このためにRubyに新しい構文考えましたよ!
こんなのです。
_[-3, -2, -1] >> numbers
numbers # => [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
どうですか?_
(アンダースコア)が気になりますか?
_ = Class.new(Array) do
def >>(array)
array.unshift(*self)
end
end
_[-3, -2, -1] >> numbers
numbers # => [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ふざけたモンキーパッチばかりやってると、また怒られちゃうので、今日はこの辺で。
あなたも嫌いなメソッドありますか?
(追記:2013-09-03)
ブコメでなぜArray#>>
じゃないのか、つまり
class Array
def >>(array)
array.unshift(*self)
end
end
numbers = [*0..9] # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[-3, -2, -1] >> numbers
numbers # => [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
とすれば_
(アンダースコア)は不要じゃないかという意見がありました。
もっともなご意見ですが、そうすると記事のネタ度が下がりマジ度が上がるという問題があったので、このブログの性質上ここでは採用しませんでした。
と、言いたいところですが、実はふざけた実装ばかり考えていた結果、一番まともな実装に気づかなかった(!)というのが本当のところですorz
ただ、どうでしょう。この手の提案は既にありそうですし、Array#<<
との対称性がないというのもイタイところですねー。
blog comments powered by Disqus