sliceメソッド
Rubyのsliceメソッドは、配列や文字列などから指定した要素を抽出するメソッドです。
sliceメソッドで要素を抽出する方法には、主に次の4つの方法があります。
- 指定したインデックスの要素を抽出 | slice(index)
- インデックスとそこからの長さを指定して要素を抽出 | slice(index, length)
- 範囲を指定して要素を抽出 | slice(range)
- 文字列の場合は、正規表現に一致する文字を抽出 | slice(regex)
用途により引数の指定方法を使い分けします。
実際にサンプルコードを見ながら、sliceメソッドの使い方を学んでいきましょう。
配列(Array)の要素を抽出する
まずは、Arrayクラスでsliceメソッドを使う方法から解説していきます。
冒頭で述べた通り、sliceメソッドを使ってArrayクラスから要素を抽出する方法には、次に紹介する3つの方法(構文)があります。
Array#slice(index)
1つ目は、配列のインデックスを引数に1つ指定して、その位置の要素を取得する最もシンプルでよく使う方法です。
array = ["Ruby", "PHP", "Python", "Java"]
p array.slice(1)
【実行結果】
"PHP"
引数にマイナス値を指定することも可能です。マイナス値を引数に指定すると、配列の末尾から数えたインデックス指定となり、-1が配列の末尾、-2が末尾から数えて2番目…のようにインデックスを後ろから指定します。
array = ["Ruby", "PHP", "Python", "Java"]
p array.slice(-1)
p array.slice(-2)
【実行結果】
"Java"
"Python"
Array#slice(index, length)
2つ目は、配列のインデックスおよび、取得する要素数を指定して、その範囲の要素を抽出する方法です。
次のサンプルコードは、配列の2番目から2つの要素を抽出する例です。
array = ["Ruby", "PHP", "Python", "Java"]
p array.slice(1, 2)
【実行結果】
["PHP", "Python"]
このように、2つの引数(取得開始インデックス、長さ)を指定するsliceメソッドの場合、戻り値の型は配列になります。
Array#slice(index)の時と同様に、第1引数にマイナス値を指定することも配列の末尾から数えたインデックス指定となり、-1が配列の末尾、-2が末尾から数えて2番目…のようにインデックスを指定し、そこから第2引数で指定した数の要素を取得します。
array = ["Ruby", "PHP", "Python", "Java"]
p array.slice(-2, 2) #配列の末尾2番目から2つ要素を取得
【実行結果】
["Python", "Java"]
Array#slice(range)
3つ目は、sliceメソッドの引数に範囲オブジェクトを指定し、指定した範囲の要素を抽出する方法です。
範囲オブジェクトは、その名の通り、範囲の開始値と終了値を「..」でつないで書いた、範囲を指定するリテラル表現です。
array = ["Ruby", "PHP", "Python", "Java"]p array.slice(1..2) #2〜3番目の要素を抽出p array.slice(2..3) #3〜4番目の要素を抽出
【実行結果】
["PHP", "Python"]["Python", "Java"]
範囲オブジェクトで指定した値が、配列要素の範囲外であった場合、slice(range)メソッドは空の配列を返します。
array = ["Ruby", "PHP", "Python", "Java"]p array.slice(4..5) #存在しない5〜6番目の要素を範囲オブジェクトで指定
【実行結果】
[]
また、範囲オブジェクトの終了値が、配列の範囲外である場合は、開始位置から配列末尾までの要素が抽出されます。
array = ["Ruby", "PHP", "Python", "Java"]p array.slice(2..5) #範囲オブジェクトの終了値に配列の範囲外の値を指定
【実行結果】
["Python", "Java"]
破壊的メソッドの「slice!」
Rubyでは、メソッド名の末尾にびっくりマークが付くメソッドは、自分自身の値を書き換える破壊的メソッドと呼ばれます。
sliceメソッドにも破壊的メソッドがあり、slice!を使用すると、引数で指定したインデックスや範囲の要素を抽出する所までは同じですが、破壊的メソッドは抽出した要素を配列自身から削除します。
array = ["Ruby", "PHP", "Python", "Java"]p array.slice!(2) #3番目の"Python"を指定p array
【実行結果】
"Python"["Ruby", "PHP", "Java"]
このように、slice!メソッドを使用すると、取り出した要素が配列から削除されているのが分かります。slice!メソッドを使用することで、配列要素の「切り取り」のようなことが、たった1行のコードで実現できます。
Stringでsliceを使用する
sliceメソッドは、文字列のStringクラスでも使えます。使い方は配列(Array)の時と同様で、指定した位置や範囲にある文字をsliceメソッドで抽出できます。
Stringクラスのsliceメソッドの特徴として、引数に正規表現を指定すると、正規表現にマッチした部分の文字列を抽出することも可能です。
では、それぞれの引数指定パターンごとに、sliceメソッドの使い方を見ていきましょう。
String#slice(index)
文字の位置(インデックス)を引数に1つ指定するめそでは、その位置の文字を1文字だけ抽出できます。
str = "ABCDEFG"p str.slice(2)
【実行結果】
"C"
引数にマイナス値を指定すると、配列の時と同様、文字列の末尾から数えた位置指定となります。
str = "ABCDEFG"p str.slice(-1)p str.slice(-2)
【実行結果】
"G""F
String#slice(index, length)
第1引数に配列のインデックス、第2引数に取得する要素数を指定して、その範囲の文字を抽出します。
str = "ABCDEFG"p str.slice(2, 4) #3文字目から4文字抽出
【実行結果】
"CDEF"
String#slice(range)
sliceメソッドの引数に範囲オブジェクトを指定すると、指定した範囲の文字を抽出します。
str = "ABCDEFG"p str.slice(2..4) #3〜5文字目を抽出
【実行結果】
"CDE"
String#slice(正規表現)
正規表現をsliceメソッド引数に指定して、正規表現にマッチした部分の文字列を抽出できます。
str = "1234567890ABCDEFG"p str.slice(/[A-Z]+/) #英字の文字を正規表現で検索
【実行結果】
"ABCDEFG"
Rubyの配列操作をマスター
配列や文字列から、指定した要素の値を抽出するsliceメソッドの使い方について解説してきました。sliceメソッドを活用して、少ないコードで配列操作が行えるように使い方をマスターしていきましょう。
Rubyの多くのメソッドには、非破壊メソッドと破壊的メソッドがあり、sliceメソッドにも最後にびっくりマーク!が付いた破壊的メソッドがあります。このslice!メソッドは、戻り値に指定された要素を抽出した結果を返すまでは同じですが、同時に自分自身の要素から抽出した要素を削除します。