バナー画像

sliceメソッド

Rubyのsliceメソッドは、配列や文字列などから指定した要素を抽出するメソッドです。

sliceメソッドで要素を抽出する方法には、主に次の4つの方法があります。

用途により引数の指定方法を使い分けします。

ポテパンダの一言メモ

Rubyの多くのメソッドには、非破壊メソッドと破壊的メソッドがあり、sliceメソッドにも最後にびっくりマーク!が付いた破壊的メソッドがあります。このslice!メソッドは、戻り値に指定された要素を抽出した結果を返すまでは同じですが、同時に自分自身の要素から抽出した要素を削除します。

実際にサンプルコードを見ながら、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】配列に要素を追加するpush/appendや非破壊的に追加する方法

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。