Rubyメソッド集【備忘録】
チェリー本を読んでいたが、何も覚えていなかったので、アウトプットする。 www.amazon.co.jp
公式ドキュメントを読めば全て書いてあるので、全て知りたい人はそちらまで。
公式ドキュメント_Ruby 2.7.0 リファレンスマニュアル
docs.ruby-lang.org
組み込みライブラリdocs.ruby-lang.org
組み込みライブラリは Ruby 本体に組み込まれているライブラリのこと。このライブラリに含まれるクラスやモジュールは、 require を書かなくても使うことができる。
文字列編
to_s 文字列にする
to_f 整数から小数にする
to_i 整数にする
paizaをやっていると、デフォルトは以下のようになっている。
input_line = gets puts input_line
getsメソッド(読み方は「ゲッツ」ではなく、「ゲットエス」get stringの略)を使っているため、変数input_lineには文字列が入る。
整数同士の割り算は整数になり、小数点以下は切り捨てられる。
小数点以下の値が必要な場合は、どちらかの値に小数点の.0を付けます。
数値の切り捨て・切り上げ・四捨五入については以下の記事参照。
Rubyで数値の切り捨て・切り上げ・四捨五入する
sprintfメソッド 指定されたフォーマットの文字列を作成する
sprintf('%0.3f', 1.2) # => "1.200"
%0.3f:小数第3位まで数字を表示させるフォーマット文字列
配列と繰り返し処理
puts [1,2,3].size 3 => nil
sumメソッド
合計値を算出する。
puts [1,2,3].sum 6 => nil
uniqメソッド
配列から重複した要素を取り除いた新しい配列を返す。
p [1,2,2,3,5,5,6].uniq [1, 2, 3, 5, 6] => [1, 2, 3, 5, 6]
sampleメソッド
p [1,2,3].sample 3 => 3
shuffleメソッド
p [1,2,3].shuffle [1, 3, 2] => [1, 3, 2]
sortメソッド
昇順に並び替える
p [1,3,2].sort [1, 2, 3] => [1, 2, 3]
降順にしたい場合は、reverseをつける
p [1,3,2].sort.reverse [3, 2, 1] => [3, 2, 1]
joinメソッド
p [1,2,3,4].join "1234" => "1234" p [1,2,3,4].join("/") "1/2/3/4" => "1/2/3/4"
splitメソッド
スペース区切りになっている文字列を配列にして返す。
p ("a b c d e").split ["a", "b", "c", "d", "e"] => ["a", "b", "c", "d", "e"]
引数を指定すると、スペース以外の文字にも対応できる。
p ("abcde").split("c") ["ab", "de"] => ["ab", "de"]
deleted_at()
配列内の特定の1にある要素を削除したい時
a = [1,2,3] a.deleted_at(2) #=> 3 a => [1,2]
divmodメソッド
割り算の商と余りを配列として返す
14.divmod(3) => [4,2]
deleteメソッド
配列に指定した値に完全一致する要素を削除する
a = [1,2,3,1,2,3] a.delete(2) a => [1,3,1,3]
delete_ifメソッド
条件をみたした要素だけ削除したい時
a = [0, 1, 2, 3, 4, 5] a.delete_if{|x| x % 2 == 0} p a #=> [1, 3, 5]
ブロックを使う配列のメソッド
numbers = [1,2,3,4,5] new_numbers = numbers.map { |n| n * 10 } new_numbers => [10,20,30,40,50]
空の配列を用意して、他の配列をループ処理した結果を空の配列に詰め込むような処理に適している
select/find_all
各要素に対して、ブロックを評価し、その戻り値が真の要素を集めた配列を返す
numbers = [1,2,3,4,5,6] even_numbers = numbers.select { |n| n.even? } even_numbers => [2,4,6]
reject
selectの反対で、真にならなかった要素を集めた配列を返す
numbers = [1,2,3,4,5,6] odd_numbers = numbers.reject { |n| n.even? } odd_numbers => [1,3,5]
find/detect
ブロックの戻り値が真になった最初の要素を返す
numbers = [1,2,3,4,5,6] even_number = numbers.find { |n| n.even? } even_number => 2
inject/reduce
たたみ込み演算を行うメソッド
numbers = [1,2,3,4] sum = numbers.inject(0) { |result, n| result + n } sum => 10
ブロックの第1引数は初回のみinjectメソッドの引数が入ります。この場合は0。
2回目以降は前回のブロックの戻り値が入る。
injectでフィボナッチ数列を考える
(0..10).inject([1,1]) { |fib, n| fib << fib[n] + fib[n+1] } #=> [1, 1, 3, 3, 7, 7, 15, 15, 31, 31, 63, 63, 127]
1回目:fib = [1,1], n = 0。fib[n] = 1, fib[n+1] = 1。fibに2が追加される
2回目:fib = [1,1,2], n = 1。fib[n] = 1, fib[n+1] = 2。fibに3が追加される
3回目:fib = [1,1,2,3], n = 2。fib[n] = 2, fib[n+1] = 3。fibに5が追加される
以下条件下のみ、&:メソッド名という書き方が出来る。
①ブロック引数が1つだけ
②ブロックの中で呼び出すメソッドには引数がない
③ブロックの中では、ブロック引数に対してメソッドを1回呼び出す以外の処理がない。
範囲(Range)
配列や文字列の一部を抜き出す
a = [1,2,3,4,5] a[1..3] => [2,3,4] a[1...3] => [2,3] a = 'abcdef' a[1..3] => "bcd"
n以上m以下、n以上m未満の判定をする
def liquid?(temperature) (0...100).include?(temperature) end
to_a
値が連続する配列を作る
(1..5).to_a #=> [1,2,3,4,5] (1...5).to_a #=> [1,2,3,4] ('a'..'c').to_a => ["a", "b", "c"]
スプラット展開
[*1..5] #=> [1,2,3,4,5] [*'a'..'c'] #=> ["a", "b", "c"]
繰り返し処理を行う
範囲オブジェクトに対して、直接eachメソッドを呼び出すことが可能
sum = 0 (1..4).each { |n| sum += n } sum #=> 10
stepメソッドを使うと、値を増やす間隔を指定できる
numbers = [] (1..10).step(2) {|n| numbers << n } #=> (1..10) numbers #=> [1,3,5,7,9]
nからmまで、数値をx個ずつ増やしながら処理を行う
開始値.step(上限値, 1度に増減する大きさ)
numbers = [] 1.step(10, 2) { |n| numbers << n } #=> 1 numbers #=> [1,3,5,7,9]
times
配列を使わず、単純にn回処理したい場合
sum = 0 5.times { |n| sum += n } sum #=> 10
upto
nからmまで数値を1つずつ増やしながら何か処理をしたい場合
a = [] 10.upto(14) { |n| a << n } a #=> [10,11,12,13,14] a = [] 'a'.upto('e') { |n| a << n } a #=> ["a", "b", "c", "d", "e"]
downto
逆に減らしたい場合
a = [] 14.downto(10) {|n| a << n }