Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. 配列.slice / [] / first / last

配列.slice / [] / first / last

配列の一部を取得するメソッドです。インデックスや範囲で要素を切り出す『slice』『[]』から、先頭・末尾を取得する『first』『last』、指定数を取り出す『take』『drop』まで揃っています。

構文
# インデックスや範囲で要素を取得します。
配列[インデックス]
配列[開始, 長さ]
配列[範囲]
配列.slice(インデックス)
配列.slice(開始, 長さ)

# 先頭・末尾の要素を取得します。
配列.first        # 先頭の1要素
配列.first(n)     # 先頭のn要素(配列で返す)
配列.last         # 末尾の1要素
配列.last(n)      # 末尾のn要素(配列で返す)

# 条件を満たす間だけ取得・スキップします。
配列.take(n)
配列.take_while { |要素| 条件 }
配列.drop(n)
配列.drop_while { |要素| 条件 }
メソッド一覧
メソッド概要
slice(index)指定インデックスの要素を返します。負のインデックスは末尾から数えます。
slice(start, length)開始位置から指定した長さ分の要素を配列で返します。
slice(range)範囲オブジェクトで指定した要素を配列で返します。
first / first(n)先頭の要素、またはn個の要素を返します。
last / last(n)末尾の要素、またはn個の要素を返します。
take(n)先頭からn個の要素を配列で返します。
take_while { |e| ... }ブロックが『true』を返す間だけ要素を取得します。
drop(n)先頭からn個をスキップした残りの配列を返します。
drop_while { |e| ... }ブロックが『true』を返す間だけ要素をスキップします。
サンプルコード
arr = [10, 20, 30, 40, 50, 60, 70]

# インデックスで取得
puts arr[0]         # 10(先頭)
puts arr[-1]        # 70(末尾)
puts arr[2, 3].inspect  # [30, 40, 50](インデックス2から3要素)
puts arr[1..3].inspect  # [20, 30, 40](範囲オブジェクトで指定)
puts arr[1...3].inspect # [20, 30](終端を含まない範囲)

# first / last
puts arr.first      # 10
puts arr.first(3).inspect  # [10, 20, 30]
puts arr.last       # 70
puts arr.last(2).inspect   # [60, 70]

# take / drop
puts arr.take(3).inspect   # [10, 20, 30]
puts arr.drop(4).inspect   # [50, 60, 70]

# 条件付きの取得・スキップ
numbers = [2, 4, 6, 7, 8, 10]
puts numbers.take_while { |n| n.even? }.inspect   # [2, 4, 6](奇数が出たら止まる)
puts numbers.drop_while { |n| n.even? }.inspect   # [7, 8, 10](奇数から開始)

# ページネーションの実装例
items = (1..100).to_a
page = 2
per_page = 10
result = items.drop((page - 1) * per_page).take(per_page)
puts result.inspect   # [11, 12, 13, 14, 15, 16, 17, 18, 19, 20](2ページ目)
概要

『[]』と『slice』はほぼ同じ動作ですが、範囲外のインデックスを指定した場合の挙動が若干異なります。配列の長さを超えたインデックスを指定すると『nil』が返るため、戻り値を使う前に『nil』チェックを行うことを推奨します。

『first』『last』は引数なしで呼ぶと要素そのもの(配列でない)を返しますが、引数ありで呼ぶと常に配列を返します。この違いに注意が必要です。例えば『first(1)』は『[要素]』という1要素の配列を返します。

『take』と『drop』は合わせて使うと配列の分割が簡単に行えます。ページネーション処理のような「N件スキップしてM件取得」という操作を直感的に書けます。範囲オブジェクトと組み合わせた『arr[1..3]』の形式も非常によく使われます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。