概要
プロを目指す人のためのRuby入門を読み、知識を定着させたいと思い、アウトプットさせて頂きます。
ブロックを使用したメソッドの書き方
記事などを読み、今までは一体何の処理をしているのかわからなかった記述も、この書籍でRubyの深い部分を学ぶことで、理解につながることが多々ありました。
['ruby', 'java', 'python'].map { |s| s.upcase } #=> ["RUBY", "JAVA", "PYTHON"]
# 上記一文の書き換え
['ruby', 'java', 'python'].map(&:upcase) #=> ["RUBY", "JAVA", "PYTHON"]
[1, 2, 3, 4, 5, 6].select { |n| n.odd? } #=> [1, 3, 5]
# 上記一文の書き換え
[1, 2, 3, 4, 5, 6].select(&:odd?) #=> [1, 3, 5]
こちらでは、mapメソッドやselectメソッドにブロックを渡す代わりに、&:メソッド名という引数を渡すことができるということを学びました。
しかし、この書き方を使用するためには条件があり、
①ブロックパラメータが1個だけである。
②ブロックの中で呼び出すメソッドには引数がない
③ブロックの中では、ブロックパラメーターに対してメソッドを1回呼び出す以外の処理がない。
という3つの条件を満たす必要があるということでした。
こちらの書籍では、次のようなコードではこの変換は使用できないと記載されています。
# ブロックの中でメソッドではなく演算子を使っている
[1, 2, 3, 4, 5, 6].select { |n| n % 3 == 0 }
# ブロック内のメソッドで引数を渡している
[9, 10, 11, 12].map { |n| n.to_s(16) }
# ブロックの中で複数の文を実行している
[1, 2, 3, 4].map do |n|
m = n * 4
m.to_s
end
慣れるまではブロックを使用した書き方を使用していこうと思いますが、今後リファクタリングなどを行う過程で、&:メソッド名という記法を使用して記述できるようにしたいと思います。
timesメソッド
4章では、繰り返し処理も学びました。timesメソッドはpaizaなどの問題を解く上でよく出てきたので、ここでマスターしたいと思います。
sum = 0
# 処理を5回繰り返す。nには0, 1, 2, 3, 4が入る
5.times { |n| sum += n }
sum #=> 10
5回処理を繰り返すという記述です。ここで重要だと感じたのは、nには0〜4の5つが入るということです。
また、ブロックパラメーターを使用しない書き方もあるようです。
sum = 0
# sumに1を加算する処理を5回繰り返す
5.times { sum += 1 }
sum #=> 5
この場合だと、1を単純に5回足すという意味合いになるのですね。
繰り返し処理で使うbreakとreturnの違い
ここでは、breakとruturnの違いについて学びました。
breakは、「繰り返し処理からの脱出」、returnは「繰り返し処理のみならずメソッドからの脱出」ということを学びました。
実際に書籍のコードを見てみます。
def calc_with_break
numbers = [1, 2, 3, 4, 5, 6]
target = nil
numbers.shuffle.each do |n|
target = n
# breakで脱出する
break if n.even?
end
target * 10
end
calc_with_break #=> 40
こちらのコードは、もしnが偶数であれば繰り返し処理のみ抜けてメソッド内のtarget * 10
を行って返すというメソッドの記述です。
次に、こちらのコードです。
def calc_with_return
numbers = [1, 2, 3, 4, 5, 6]
target = nil
numbers.shuffle.each do |n|
target = n
# returnで脱出する?
return if n.even?
end
target * 10
end
calc_with_return #=> nil
これは、returnが呼ばれた瞬間にメソッド全体を脱出してしまい、メソッドの戻り値がnilになってしまうということでした。
まとめ
書籍を読んでいく中で、理解を深められるように今後も定期的にアウトプットをしていきたいと考えています。
参考
・伊藤 淳一. プロを目指す人のためのRuby入門[言語使用からデバック技法まで] 株式会社技術評論社