Ruby_Array_20

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

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

インスタンスメソッド

drop(n) -> Array
  • 配列の先頭のn要素を捨てて、残りの要素を配列として返す
    • 元配列を破壊するわけではない
rb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:0> v = arr.drop(2)
=> [3, 4, 5]

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

irb(main):004:0> v
=> [3, 4, 5]

# memo
# "元配列を破壊するわけではない"というのは、drop実行後にarrが変わらないということか
irb(main):001:0> arr = %w[a b c d e]
=> ["a", "b", "c", "d", "e"]

irb(main):002:0> v = arr.drop(2)
=> ["c", "d", "e"]

irb(main):003:0> v[1].capitalize!
=> "D"

irb(main):004:0> v
=> ["c", "D", "e"]

irb(main):005:0> arr
=> ["a", "b", "c", "D", "e"]

# memo
# "元配列を破壊するわけではない"けど、こういうことは起きる
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:0> arr.drop(100)
=> []

irb(main):003:0> arr.drop(0)
=> [1, 2, 3, 4, 5]
irb(main):001:0> arr.drop(-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):4:in `<main>'
        1: from (irb):4:in `drop'
ArgumentError (attempt to drop negative size)

# memo
# 負の数を指定するとArgumentErrorエラー
drop_while -> Enumerator
drop_while {|element| ... } -> Array
  • ブロックを評価して最初に偽となった要素の手前の要素まで捨て、残りの要素を配列として返す
    • 元配列を破壊するわけではない
  • ブロックを指定しなかった場合はEnumeratorを返す
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:0> brr = arr.drop_while {|v| v < 3 }
=> [3, 4, 5]

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

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

irb(main):002:0> v = arr.drop_while
=> #<Enumerator: [1, 2, 3, 4, 5]:drop_while>

irb(main):003:0> arr[3] = 'a'
=> "a"

irb(main):004:0> arr
=> [1, 2, 3, "a", 5]
irb(main):005:0> v
=> #<Enumerator: [1, 2, 3, "a", 5]:drop_while>
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:0> brr = arr.drop_while
=> #<Enumerator: [1, 2, 3, 4, 5]:drop_while>

irb(main):003:0> crr = brr.each {|v| v < 3 }
=> [3, 4, 5]

irb(main):004:0> arr
=> [1, 2, 3, 4, 5]

irb(main):005:0> brr
=> #<Enumerator: [1, 2, 3, 4, 5]:drop_while>

irb(main):006:0> crr
=> [3, 4, 5]

irb(main):007:0> arr[3] = 'a'
=> "a"

irb(main):008:0> arr
=> [1, 2, 3, "a", 5]

irb(main):009:0> brr
=> #<Enumerator: [1, 2, 3, "a", 5]:drop_while>

irb(main):010:0> crr
=> [3, 4, 5]

# memo
# Enumeratorに対してはeachを利用(brr  {|v| v < 3 } じゃなかった)

メモ

  • drop_whileにブロックを指定しない場合の利用例を公式ドキュメントに書いて欲しい。わからなかった。