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するとエラーが起こる。何もしないというのは違う感じ。
ruby/array.c at 28fb6d6b9e06a632f96244a635a045622a6be276 · ruby/ruby · GitHub
ruby/error.c at 75aae66c4f3eacd527cea71e0c8e486b630fc0a4 · ruby/ruby · GitHub
ruby/error.h at cb4e2cb55a59833fc4f1f6db2f3082d1ffcafc80 · ruby/ruby · GitHub
ruby/array.c at 28fb6d6b9e06a632f96244a635a045622a6be276 · ruby/ruby · GitHub
メモ
- ドキュメントのunshift, prependのサンプルの配列の命名が
ary
じゃなくてarr
だ。ドキュメント全体で揃っていない。メソッド呼び出し時にカッコをつけていない。