Ruby_Array_5

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

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

インスタンス

self[nth] -> object | nil
at(nth) -> object | nil
  • nth番目の要素を返す
    • nth番目の要素が存在しないときはnilを返す
    • 先頭の要素が0番目
    • nthの値が負のときは末尾からのインデックスとみなす
      • 末尾の要素が-1番目
  • nthに整数以外のオブジェクトを指定した場合はto_intメソッドによる暗黙の型変換を試みる
irb(main):001:0> ['a', 'b', 'c'][0]
=> "a"

irb(main):002:0> ['a', 'b', 'c'][1]
=> "b"

irb(main):003:0> ['a', 'b', 'c'][5]
=> nil

irb(main):004:0> ['a', 'b', 'c'][-1]
=> "c"

irb(main):005:0> ['a', 'b', 'c'][-2]
=> "b"

irb(main):006:0> ['a', 'b', 'c'][-5]
=> nil
irb(main):001:0> ['a', 'b', 'c'][0.2]
=> "a"

irb(main):002:0> ['a', 'b', 'c'][1.2]
=> "b"

# memo
# 0.2.to_i #=> 0
# 1.2.to_i #=> 1
irb(main):001:0> ['a', 'b', 'c']['1']
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):1:in `<main>'
        1: from (irb):1:in `[]'
TypeError (no implicit conversion of String into Integer)

# memo
# '1'は整数以外のオブジェクトで、to_iすると1になるけど、
# to_intメソッドによる暗黙の型変換ではTypeErrorになるのかな?
# '1'.to_i #=> 1
self[range] -> Array | nil
  • Rangeオブジェクトrangeの範囲にある要素からなる部分配列を返す
    • rangeのfirstの値が配列の範囲に収まらない場合nilを返す
    • rangeのfirstがendより後にある場合は空の配列を返す
  • rangeのfirstやendの値が負のときは末尾からのインデックスとみなす
  • endの値が配列の範囲を超えるとき、超えた分は無視される
rb(main):001:0> ['a', 'b', 'c', 'd', 'e'][0..1]
=> ["a", "b"]

irb(main):002:0> ['a', 'b', 'c', 'd', 'e'][0...1]
=> ["a"]

irb(main):003:0> ['a', 'b', 'c', 'd', 'e'][0..-1]
=> ["a", "b", "c", "d", "e"]

irb(main):004:0> ['a', 'b', 'c', 'd', 'e'][0..-2]
=> ["a", "b", "c", "d"]

irb(main):005:0> ['a', 'b', 'c', 'd', 'e'][-2..-1]
=> ["d", "e"]
irb(main):001:0> ['a', 'b', 'c', 'd', 'e'][-2..4]
=> ["d", "e"]

irb(main):002:0> ['a', 'b', 'c', 'd', 'e'][1..10]
=> ["b", "c", "d", "e"]
irb(main):001:0> ['a', 'b', 'c', 'd', 'e'][10..20]
=> nil

# 特殊なケース
# 5番目に要素がないので上記と同様にnilかと思いきや
# firstが自身の長さと同じ場合には以下のようになる
irb(main):002:0> ['a', 'b', 'c', 'd', 'e'][5..20]
=> []
irb(main):001:0> ['a', 'b', 'c', 'd', 'e'][2..1]
=> []

irb(main):002:0> ['a', 'b', 'c', 'd', 'e'][-1..2]
=> []
irb(main):001:0> ['a', 'b', 'c', 'd', 'e'][0..0]
=> ["a"]

irb(main):002:0> ['a', 'b', 'c', 'd', 'e'][0...0]
=> []
irb(main):001:0> ['a', 'b', 'c', 'd', 'e'][3..4.2]
=> ["d", "e"]

# memo
# 4.2.to_i #=> 4
self[start, length] -> Array | nil
  • start番目からlength個の要素を含む
    • lengthが負、もしくは、startが自身の範囲を超えたときはnilを返す
  • start、lengthは整数以外のオブジェクトを指定した場合、 to_int メソッドによる暗黙の型変換を試みる
irb(main):001:0> ['a', 'b', 'c', 'd', 'e'][0, 2]
=> ["a", "b"]

irb(main):002:0> ['a', 'b', 'c', 'd', 'e'][-3, 2]
=> ["c", "d"]
irb(main):001:0> ['a', 'b', 'c', 'd', 'e'][0, 0]
=> []

irb(main):002:0> ['a', 'b', 'c', 'd', 'e'][0, 10]
=> ["a", "b", "c", "d", "e"]
irb(main):002:0> ['a', 'b', 'c', 'd', 'e'][0, -1]
=> nil

irb(main):001:0> ['a', 'b', 'c', 'd', 'e'][10, 1]
=> nil

# 特殊なケース
# 5番目に要素がないので上記と同様にnilかと思いきや
# startが自身の長さと同じ場合には以下のようになる
irb(main):023:0> ['a', 'b', 'c', 'd', 'e'][5, 1]
=> []
irb(main):001:0> ['a', 'b', 'c', 'd', 'e'][3, 2.2]
=> ["d", "e"]

# memo
# 2.2.to_i #=> 2

メモ

  • nilと空配列を返すパターンは覚えておきたい。返り値の型が変わるので。
  • Range、.. は 以下(いか)、... は 未満(みまん)、と、点の数とひらがなの数で覚えている