Search

検索したいワードを入力してください

2019年03月11日

Rubyのsliceメソッドの使い方を目的別に解説

Rubyには、配列、文字列、ハッシュの一部分を抽出するsliceメソッドがあります。これは破壊的メソッドとして用いると、一部分を別の配列に移動することができます。また、各クラス間で引数など、扱い方に違いがあるので、それについても紹介します。

Rubyのsliceメソッドの使い方を目的別に解説

Rubyにおけるsliceメソッドとは

Rubyにおけるsliceメソッドとは、配列、文字列、ハッシュから引数で指定した一部分を抽出するメソッドです。引数には番号やキーを用いるので、[](添字)で指定するのとほぼ同じ扱いができます。

配列をsliceして要素を抽出する

配列におけるsliceメソッドには、非破壊的メソッドと破壊的メソッドがあります。

非破壊的メソッドは添字と同じように扱うことができます。一方、破壊的メソッドは取り除く対象の要素が戻り値となり、配列は取り除いた後の配列に変更されます。

ここはRubyにおける他のメソッドと振舞いが異なるので注意してください。

配列の番号を指定する

引数に1つの整数を指定した場合、引数を番号とする値が返されます。破壊的メソッドでは、値を返すと同時に、その値がある番号の要素が元の配列から取り除かれます。以下は、sliceメソッドを、配列の番号を指定して使用したRubyスクリプトです。

サンプルコード

fruits=["Apple","Banana","Orange","Lemon","Peach"]

puts fruits.slice(1) #=> Banana
puts fruits[1] #=> Banana
puts fruits.slice!(1) #=> Banana
p fruits #=> ["Apple", "Orange", "Lemon", "Peach"]

配列の最後の要素から配列の番号を指定する

引数に負の整数を指定した場合、配列の最後から数えた番号の要素が返されます。以下は、sliceメソッドを、配列の最後から数えた番号を指定して使用したRubyスクリプトです。

fruits=["Apple","Banana","Orange","Lemon","Peach"]

puts fruits.slice(-2) #=> Lemon
puts fruits[-2] #=> Lemon
puts fruits.slice!(-2) #=> Lemon
p fruits #=> ["Apple", "Banana", "Orange", "Peach"]

配列の番号の範囲を指定する

sliceメソッドでは、範囲を指定して抽出することもできます。2つの整数を指定した場合、第1引数を番号とする要素から第2引数の個数分の部分配列が返されます。範囲演算子を使用した場合、指定範囲の部分配列が返されます。

以下は、sliceメソッドを、配列の番号の範囲を指定して使用したRubyスクリプトです。

fruits=["Apple","Banana","Orange","Lemon","Peach"]

p fruits.slice(1..3) #=> ["Banana", "Orange", "Lemon"]
p fruits[1..3] #=> ["Banana", "Orange", "Lemon"]
p fruits.slice(1,2) #=> ["Banana", "Orange"]
p fruits[1,2]
p fruits.slice!(1..3) #=> ["Banana", "Orange", "Lemon"]
p fruits #=> ["Apple", "Peach"]

文字列をsliceして文字列を抽出する

文字列におけるsliceメソッドにも、配列と同じく非破壊的メソッドと破壊的メソッドがあります。非破壊的メソッドは添字と同じように扱うことができます。一方、破壊的メソッドは取り除く対象の部分文字列が戻り値となり、文字列は取り除いた後の文字列に変更されます。

添字を指定して取り出す

引数に1つの整数を指定した場合、引数を番号とする文字が返されます。負の整数を指定した場合は、最後から数えた文字が返されます。以下は、文字列におけるsliceメソッドを、文字列の番号を指定して使用したRubyスクリプトです。

サンプルコード

word="The apple is 300g, and the banana is 200g."
puts word.slice(5) #=> p
puts word[5] #=> p
puts word.slice(-8) #=> i
puts word[-8] #=> i
puts word.slice!(5) #=> p
puts word #=> The aple is 300g, and the banana is 200g.

文字を範囲で取り出す

sliceメソッドでは、範囲を指定して抽出することもできます。引数に2つの整数を指定した場合、第1引数を番号とする要素から第2引数の個数分の部分文字列が返されます。また、引数に範囲演算子を使用した場合、指定範囲の部分文字列が返されます。

以下は、文字列におけるsliceメソッドを、文字列の範囲を指定して使用したRubyスクリプトです。

サンプルコード

word="The apple is 300g, and the banana is 200g."
puts word.slice(4,7) #=> apple i
puts word[4,7] #=> apple i
puts word.slice(4..10) #=> apple i
puts word[4..10] #=> apple i
puts word.slice!(4..10) #=> apple i
puts word #=> The s 300g, and the banana is 200g.

文字を正規表現を使って取り出す

引数には正規表現も指定でき、先頭から見て最初にマッチした部分文字列が返されます。以下は、文字列におけるsliceメソッドを、正規表現を指定して使用したRubyスクリプトです。

サンプルコード

word="The apple is 300g, and the banana is 200g."
puts word.slice(/\d+/) #=> 300
puts word.slice!(/\d+/) #=> 300
puts word #=> The apple is g, and the banana is 200g.

matchで部分的に文字列を取り出す

sliceメソッドと同じく、引数に正規表現を指定すことで、先頭から見て最初にマッチした部分文字列が返されます。

ブロックを渡すと、ブロック変数の0番要素にはマッチした部分全体、1番要素以降には()でキャプチャした部分が得られます。なお、このメソッドにはマッチした部分文字列を取り除く破壊的メソッドは存在しません。

以下は、matchメソッドを、文字列に使用したRubyスクリプトです。

サンプルコード

word="The apple is 300g, and the banana is 200g."
puts word.match(/\d+/)
word.match(/(\d+)g/) do |part|
puts part[0] #=> 300g
puts part[1] #=> 300
end

ハッシュにsliceメソッドを使う

ハッシュには要素番号がないので、キーを用いて指定を行います。引数に指定したキーについて、部分ハッシュが返されます。ここで、存在しないキーを指定しても無視されるだけで、エラーにはなりません。

なお、このメソッドには指定したキーを取り除く破壊的メソッドは存在しません。以下は、ハッシュにおけるsliceメソッドを、キーを指定して使用したRubyスクリプトです。

サンプルコード

fruits={"Apple"=>150,"Banana"=>200,"Lemon"=>120,"Orange"=>170,"Peach"=>110}
p fruits.slice("Apple","Lemon","Orange","NonExistentKey") #=> {"Apple"=>150, "Lemon"=>120, "Orange"=>170}

Rubyのsliceメソッドを用いたプログラムの例

以下のRubyスクリプトでは、11から1000までの、5の倍数でない奇数から成る配列intsを、sliceメソッドによって素数であるものをprime_intに移動しています。

require"prime"

ints=[]

10.step(1000-1,10) do |i|
ints.concat([1,3,7,9].map{|s|s+i})
end
n_all=ints.length

prime_ints=[]

idx=0
while(n=ints[idx]) #idxが配列の末尾に達するまで
if Prime.prime?(n)
prime_ints<<ints.slice!(idx)
else
idx+=1
end
end

p prime_ints
puts

puts "素数: %d個"%prime_ints.length
puts "素数でない数: %d個"%ints.length

#全体のうち素数である整数の割合
puts format"素数の割合: %.1f%%",prime_ints.length.to_f/n_all*100

実行結果

[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461,

463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]

素数の数: 164個
素数でない数: 232個
素数の割合: 41.4%

sliceメソッドはクラスによって振舞いが異なる

Rubyにおけるsliceメソッドは、Array、String、Hashクラスにおいて用いることができ、それぞれ異なった振舞いをします。各クラスについて、非破壊的メソッドと破壊的メソッドの特徴について以下の表にまとめました。

非破壊的メソッドにおいて、Hashクラスについては、指定した複数のキーについての部分ハッシュが返されます。これは添字で行うことはできません。

非破壊的メソッド破壊的メソッド
Array指定範囲を返す指定範囲を返し、指定部分が元の配列から取り除かれる
String指定範囲を返す指定範囲を返し、指定部分が元の文字列から取り除かれる
Hash指定したキーについて、部分ハッシュを返す

Rubyのsliceは破壊メソッドの挙動に注意して使おう

いかがだったでしょうか?
sliceはメソッドの対象のクラスによって挙動が挙動が変わります。ArrayとStringは同じですが、Hashに対して使う場合は破壊的メソッドが使えません。

また、破壊的メソッドは取り出した文字列や配列で上書きをする動作をします。便利ですが間違いやすいので、しっかり覚えて使いましょう。

多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related