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位まで数字を表示させるフォーマット文字列

配列と繰り返し処理


sizeメソッド 配列の長さ(要素の個数)を取得できる。
エイリアスはlengthメソッド

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]



ブロックを使う配列のメソッド


map 各要素に対してブロックを評価した結果を新しい配列にして返す
エイリアスはcollect

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が追加される


&とシンボルを使って、もっと簡潔に書く ['ruby', 'java', 'perl'].map { |s| s.upcase }
['ruby', 'java', 'perl'].map(&:upcase)

以下条件下のみ、&:メソッド名という書き方が出来る。
①ブロック引数が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 }