FizBuzz問題で学んだrubyのメソッド達
FizzBuzz問題の学習中にrubyの色々なメソッドに触れました。
問題回答に使った各メソッドの挙動を以下まとめたいと思います。
upto
オブジェクトからmaxまで実行する処理を繰り返す。
# 基本形
オブジェクト.upto(max){|変数|
実行する処理1
実行する処理2
}
3.upto(7){|num|
print("num = ", num, "¥n")
}
# num = 3
# num = 4
# num = 5
# num = 6
# num = 7
map
繰り返し処理
配列をそのままにして新しいメソッドを作りたい時に使う。
#元arrayは変わらない。arrayをそれぞれ大文字にして返すメソッド。動的型付け。
array = ["apple","banana","orange","pain","grape",]
p array.map { |ele| ele.upcase }
p array
https://okenigou.com/2019/04/17/272
reverse
オブジェクトを反対にして返す。オブジェクト自体に変化は加えられない。破壊的メソッドを使った場合はオブジェクトの順番も変わってしまう。
a = ["a", 2, true]
p a.reverse #=> [true, 2, "a"]
p a #=> ["a", 2, true] (変化なし)
https://docs.ruby-lang.org/ja/latest/method/Array/i/reverse.html
concat
concat(other) -> self
配列 other を自身の末尾に破壊的に連結する。
array= [1, 2]
a= [3, 4]
array.concat a
p array# => [1, 2, 3, 4]
p a# => [3, 4] # こちらは変わらない
joinと似ている。
<<
str = 'abc' << 'def'
# => "abcdef"
join
配列をjoinの引数でくっつける
p ['foo', 'bar', 'buz'].join(',') #=> "foo,bar,buz"
each_slice
enum.each_slice(n){ |arr| block }
引数nで指定した数の要素を繰り返し取り出して、ブロックを実行します。
ブロック引数arrには、取り出した要素が配列で入ります。
[要素1, 要素2, 要素3]、[要素4, 要素5, 要素6]、[要素7, 要素8, 要素9]のように取り出します。
(1..10).each_slice(3) {|arr| p arr }
#=> [1, 2, 3]
#=> [4, 5, 6]
#=> [7, 8, 9]
#=> [10]
with_index
生成時のパラメータに従って、要素にインデックスを添えて繰り返します。インデックスは offset から始まります。
要素とその要素に付随するインデックスを返している。
users.map.with_index { |user, i| "#{i+1}: #{user.name}" }
chars
文字列に対してcharsメソッドを使用すると1文字ずつ分割してくれる。
p "hello".chars
#=> ["h", "e", "l", "l", "o"]
https://simanman.hatenablog.com/entry/2013/09/05/022617
偶数奇数を選別する
select
各要素に対してブロックを評価した値が真であった要素を全て含む配列を返す。
# even?がtrueの文字だけ返している。
[1,2,3,4,5].select { |num| num.even? } # => [2, 4]
selectと反対で、falseを返す要素全て含む配列を返すメソッドが、reject
# even?がfalseの文字だけ返している。
[1,2,3,4,5].reject { |num| num.even? } # => [1, 3, 5]
https://docs.ruby-lang.org/ja/latest/method/Array/i/filter.html
odd?
自身が奇数であれば真を返す。そうでない場合は偽を返す。
5.odd?# => true
10.odd?# => false
https://docs.ruby-lang.org/ja/latest/method/Integer/i/odd=3f.html
even?
自身が偶数であれば真を返す。そうでない場合は偽を返す。
10.even?# => true
5.even?# => false
三つにメソッドを同時に使うことで、偶数と奇数を判別するコードを書くことができる。
目的とする配列を取得する#selectメソッドを使用し、その後#odd|#evenメソッドを使用します
ary = [1,2,3,4,5,6]
odd = ary.select(&:odd?)
#=> [1, 3, 5]
even = ary.select(&:even?)
#=> [2, 4, 6]
https://docs.ruby-lang.org/ja/latest/method/Array/i/filter.html
https://qiita.com/siroiruka/items/bf38ac02e91f83350496
length
文字数を測るメソッド
"subaru".length # => 6
"subaru".size # => 7
"テスト".length # => 3
"テスト".size # => 3
https://docs.ruby-lang.org/ja/latest/method/String/i/length.html
size
lengthと同様、文字列の長さを測るメソッド
"subaru".length # => 6
"subaru".size # => 7
"テスト".length # => 3
"テスト".size # => 3
chomp
空白を入れる
split
文字列を指定した区切り文字で分割し、配列で返すメソッド。
splitメソッドの第一引数に区切り文字を指定し、第二引数に分割数を指定する事が出来る。
https://pikawaka.com/ruby/split
# 配列を括弧内の引数で区切る
irb(main):001:0> "Tokyo:Saitama:Okinawa".split(':')
=> ["Tokyo", "Saitama", "Okinawa"] # 配列の要素は3つある
split応用篇
# 基本形
"文字列".split(区切り文字, 分割数).map { |変数| 実行する処理 }
Word = "Now is the,time for'all good people"
Word.split(/[\\s,']/)
=> ["Now", "is", "the", "time", "for", "all", "good", "people"]
gsub
第一引数を第二引数に変換することができるメソッド
#例:
#hogehogeatgoogledotcom
#atを@に、dotを.に変換したい
S = hogehogeatgoogledotcom
puts S.gsub("at","@").gsub("dot",".")
#=> hogehoge@google.com
upcase
配列を全て大文字にする
p "stRIng? STring.".upcase # => "STRING? STRING."
https://docs.ruby-lang.org/ja/latest/method/String/i/upcase.html
to_a
ハッシュ、範囲オブジェクトなどをarray(配列)に変換するメソッド
(1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
("a".."z").to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]