Ruby_Array_62

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

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

インスタンスメソッド

zip(*lists) -> [ [object] ]
zip(*lists) {|v1, v2, ...| ...} -> nil
  • 自身と引数に渡した配列の各要素からなる配列の配列を生成して返す
    • 生成される配列の要素数はselfの要素数と同じ
  • ブロック付きで呼び出した場合は、selfと引数に渡した配列の各要素を順番にブロックに渡す
  • listsに配列以外のオブジェクトを指定した場合、to_aryメソッドによる暗黙の型変換を試み、それに応答できない場合はeachメソッドんによる暗黙の型変換を試みる。配列以外の(暗黙の型変換が行えない)オブジェクトを指定するとTypeErrorが発生する
irb(main):001:0> [1, 2, 3].zip(['a', 'b', 'c'])
=> [[1, "a"], [2, "b"], [3, "c"]]

irb(main):002:0> [1, 2, 3].zip(['a', 'b', 'c'], [4, 5, 6])
=> [[1, "a", 4], [2, "b", 5], [3, "c", 6]]

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

irb(main):002:0> brr = %w[a b c]
=> ["a", "b", "c"]

irb(main):003:0> crr = arr.zip(brr)
=> [[1, "a"], [2, "b"], [3, "c"]]

irb(main):004:0> brr[0].capitalize!
=> "A"

irb(main):005:0> crr
=> [[1, "A"], [2, "b"], [3, "c"]]
irb(main):001:0> [1, 2, 3].zip
=> [[1], [2], [3]]

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

irb(main):003:0> [].zip([1, 2, 3])
=> []

# memo
# この挙動は覚えておきたい
irb(main):001:0> [1, 2, 3].zip([4, 5, 6], [7, 8, 9]) { |arr| pp arr }
[1, 4, 7]
[2, 5, 8]                                                                                                
[3, 6, 9]                                                                                                
=> nil                                                                                                   
irb(main):002:0> [1, 2, 3].zip([4, 5, 6], [7, 8, 9]) { |v1, v2, v3| pp v2 }
4
5                                                                                                        
6                                                                                                        
=> nil
irb(main):001:0> [1, 2, 3].zip('a')
(irb):1:in `zip': wrong argument type String (must respond to :each) (TypeError)
        from (irb):1:in `<main>'
        from /Users/mfham/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>'
        from /Users/mfham/.rbenv/versions/3.1.0/bin/irb:25:in `load'
        from /Users/mfham/.rbenv/versions/3.1.0/bin/irb:25:in `<main>'
self | other -> Array
  • 集合の和演算。両方の配列いずれかに含まれる要素をすべて含む新しい配列を返す
    • 重複する要素は取り除かれる
    • 重複判定はObject#eql?とObject#hashにより行われる
    • 新しい配列における要素の順はselfにおける要素の順と同じ
  • otherには配列以外のオブジェクトを指定した場合は to_ary メソッドによる暗黙の型変換を試みる。配列以外の(暗黙の型変換が行えない)オブジェクトを指定した場合TypeErrorが発生する
irb(main):001:0> [1, 2, 3, 1] | [7, 5, 3]
=> [1, 2, 3, 7, 5]

irb(main):002:0> [1, 2, 3, 1, 1.0] | ['1']
=> [1, 2, 3, 1.0, "1"]

irb(main):003:0> [1, 2, 3] | 'a'
(irb):1:in `|': no implicit conversion of String into Array (TypeError)
        from (irb):1:in `<main>'
        from /Users/mfham/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>'
        from /Users/mfham/.rbenv/versions/3.1.0/bin/irb:25:in `load'
        from /Users/mfham/.rbenv/versions/3.1.0/bin/irb:25:in `<main>'