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"]

https://pikawaka.com/ruby/to_a

似ているメソッドまとめ

Rubyのメソッドをたくさん覚えてRubyゴールドまで取得したいものですね。