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
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS