Ruby_Array_61

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

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

インスタンスメソッド

uniq -> Array
uniq! -> self | nil
uniq {|item| ... } -> Array
uniq! {|item| ... } -> self | nil
  • uniqは配列から重複した要素を取り除いた新しい配列を返す
  • uniq!は削除を破壊的に行い、削除が行われた場合はselfを、そうでなければnilを返す
    • この挙動は覚えておきたい
  • 要素の重複判定はObject#eql?によって行われる
  • ブロックが与えられた場合、ブロックが返した値が重複した要素を取り除いた配列を返す
  • 要素を先頭から巡っていき、最初に出現したものが残る
irb(main):001:0> arr = [1, 2, 1]
=> [1, 2, 1]

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

irb(main):003:0> arr
=> [1, 2, 1]

irb(main):004:0> brr
=> [1, 2]
irb(main):001:0> arr = [1, 2, 1]
=> [1, 2, 1]

irb(main):002:0> brr = arr.uniq!
=> [1, 2]

irb(main):003:0> arr
=> [1, 2]

irb(main):004:0> brr
=> [1, 2]
irb(main):001:0> [1, 2, 3].uniq
=> [1, 2, 3]

irb(main):002:0> [1, 2, 3].uniq!
=> nil
irb(main):001:0> [1, 1.0, '1'].uniq
=> [1, 1.0, "1"]

irb(main):002:0> [1, 1.0, '1'].uniq { |v| v.to_i }
=> [1]
irb(main):001:0> v1 = 'e'
=> "e"

irb(main):002:0> v2 = 'e'
=> "e"

irb(main):003:0> arr = [v1, v2]
=> ["e", "e"]

irb(main):004:0> brr = arr.uniq
=> ["e"]

irb(main):005:0> v2.capitalize!
=> "E"

irb(main):006:0> brr
=> ["e"]

irb(main):007:0> v1.capitalize!
=> "E"

irb(main):008:0> brr
=> ["E"]

# memo
# 覚えておきたい
values_at(*selectors) -> Array
  • 引数で指定されたインデックスに対応する要素を配列で返す
    • インデックスに対応する値がなければnilが要素になる
  • インデックスは整数もしくは整数のRangeで指定する
irb(main):001:0> arr = %w[a b c d e]
=> ["a", "b", "c", "d", "e"]

irb(main):002:0> arr.values_at(0, 2, 4)
=> ["a", "c", "e"]

irb(main):003:0> arr.values_at(0, 4, 2)
=> ["a", "e", "c"]

irb(main):004:0> arr.values_at(0, 0, 0)
=> ["a", "a", "a"]

irb(main):005:0> arr.values_at(0, 4, 10)
=> ["a", "e", nil]

irb(main):006:0> arr.values_at(-4, -1, -100)
=> ["b", "e", nil]

irb(main):007:0> arr.values_at(0..2)
=> ["a", "b", "c"]

irb(main):008:0> arr.values_at(0..10)
=> ["a", "b", "c", "d", "e", nil, nil, nil, nil, nil, nil]

irb(main):009:0> arr.values_at(5..6)
=> [nil, nil]

irb(main):010:0> arr.values_at(6..7)
=> [nil, nil]

irb(main):011:0> arr.values_at(0, 1..4, 2)
=> ["a", "b", "c", "d", "e", "c"]

# memo
# 引数を前から順に処理している感じ
irb(main):001:0> arr = %w[a b c d e]
=> ["a", "b", "c", "d", "e"]

irb(main):002:0> arr.values_at(1.0)
=> ["b"]

irb(main):003:0> arr.values_at(1.8)
=> ["b"]

irb(main):004:0> arr.values_at('1.0')
(irb):4:in `values_at': no implicit conversion of String into Integer (TypeError)
        from (irb):4: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>'