Ruby_Array_19

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

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

インスタンスメソッド

dig(idx, ...) -> object | nil
  • self以下のネストしたオブジェクトをdigメソッドで再帰的に参照して返す
    • 途中のオブジェクトがnilであった場合はnilを返す
irb(main):001:0> arr = [[1, [2, 3]]]
=> [[1, [2, 3]]]

irb(main):002:0> arr.dig(0, 1, 1)
=> 3

irb(main):003:0> arr.dig(1, 2, 3, 4, 5)
=> nil
irb(main):001:0> arr = [[1, [2, 'a']]]
=> [[1, [2, "a"]]]

irb(main):002:0> v = arr.dig(0, 1, 1)
=> "a"

irb(main):003:0> v.capitalize!
=> "A"

irb(main):004:0> arr
=> [[1, [2, "A"]]]

# memo
# "参照して返す"から、返されたものに破壊的な変更を加えると元の配列に影響がでるのか
irb(main):001:0> arr = [[1, [2, 3]]]
=> [[1, [2, 3]]]

irb(main):002:0> arr.dig(0, 0, 0, 0, 0)
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):6:in `<main>'
        1: from (irb):6:in `dig'
TypeError (Integer does not have #dig method)

# memo
# 第一引数により1が、そして1(Integer)にdigメソッドはないのでエラー
irb(main):001:0> arr = [1, {foo: :bar}].dig(1, :foo)
=> :bar

irb(main):002:0> arr = [1, {foo: :bar}].dig(1, :foo, 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):2:in `<main>'
        1: from (irb):2:in `dig'
TypeError (Symbol does not have #dig method)

# memo
# Hashはdigメソッドがあるので:barを返せる
# Symbolはdigメソッドがないのでエラー
メモ
  • Arrayにもdigメソッドがある。Hashだけかと思ってた