Ruby_Array_43

この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。

class Array (Ruby 3.0.0 リファレンスマニュアル)

インスタンスメソッド

unshift(*obj) -> self
prepend(*obj) -> self
  • 指定されたobjを引数の最後から順番に配列に先頭に挿入する
    • "最後から順番に"っていうのが混乱したけど、そのまままるっと先頭に挿入されると思えばよさそう
  • 引数を指定しない場合、何もしない
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.unshift(5)
=> [5, 1, 2, 3]

irb(main):003:0> arr.unshift(7, 9)
=> [7, 9, 5, 1, 2, 3]

irb(main):004:0> arr.unshift('a', [1, 2], :foo)
=> ["a", [1, 2], :foo, 7, 9, 5, 1, 2, 3]

irb(main):005:0> arr
=> ["a", [1, 2], :foo, 7, 9, 5, 1, 2, 3]
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.unshift
=> [1, 2, 3]

irb(main):003:0> arr
=> [1, 2, 3]
[1] pry(main)> require 'pry-doc'
=> true
[2] pry(main)> show-source Array#unshift

From: array.c (C Method):
Owner: Array
Visibility: public
Signature: unshift(*arg1)
Number of lines: 16

static VALUE
rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary)
{
    long len = RARRAY_LEN(ary);
    VALUE target_ary;

    if (argc == 0) {
        rb_ary_modify_check(ary);
        return ary;
    }

    target_ary = ary_ensure_room_for_unshift(ary, argc);
    ary_memcpy0(ary, 0, argc, argv, target_ary);
    ARY_SET_LEN(ary, len + argc);
    return ary;
}
irb(main):001:0> arr = [1, 2, 3].freeze
=> [1, 2, 3]
irb(main):002:0> arr.unshift
Traceback (most recent call last):
        5: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `<main>'
        4: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `load'
        3: from /Users/mfham/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
        2: from (irb):2:in `<main>'
        1: from (irb):2:in `unshift'
FrozenError (can't modify frozen Array: [1, 2, 3])

# memo
# 引数を指定しなければ何もしないとあるが、rb_ary_modify_checkのチェックが行われている。
# レシーバをfrozenするとエラーが起こる。何もしないというのは違う感じ。

メモ

  • ドキュメントのunshift, prependのサンプルの配列の命名aryじゃなくてarrだ。ドキュメント全体で揃っていない。メソッド呼び出し時にカッコをつけていない。