🍒 はじめに
チェリー本輪読会の第15週目のエントリーになります。
輪読会の概要については第1週目にまとめています。
- 第1週目のエントリーはこちら
- 第2週目のエントリーはこちら
- 第3週目のエントリーはこちら
- 第4週目のエントリーはこちら
- 第5週目のエントリーはこちら
- 第6週目のエントリーはこちら
- 第7週目のエントリーはこちら
- 第8週目のエントリーはこちら
- 第9週目のエントリーはこちら
- 第10週目のエントリーはこちら
- 第11週目のエントリーはこちら
- 第12週目のエントリーはこちら
- 第13週目のエントリーはこちら
- 第14週目のエントリーはこちら
🍒 輪読会 第15週目まとめ
第10章10.1.1〜第10章10.6まで
期間:2021年08月30日〜2021年09月3日
yield とは
ブロックを引数として受け取り、展開するためにyield
を使います。
ここでいうブロックは、do〜end
の処理の中身を指します。
yield
とは、受け取ったブロック引数を展開するしくみです。do〜end
の中身を受け取り処理しています。
def playing puts 'guitar' yield end => :playing playing do puts 'bass' end #=> guitar #=> bass
ブロックを引数として受け取る
引数名の前に&
を付けることで、ブロックをメソッドの引数として受け取ることができます。
def playing(&block) puts 'I play guitar!!' sound = block.call('ギュイイイーーーン!!!') puts sound end playing do | sound | sound * 2 end #=> I play guitar!! #=> ギュイイイーーーン!!!ギュイイイーーーン!!!
&blockの「&」って?
&blockの&
は、引数にブロックが渡ってきた際に、Procオブジェクトへ変換する役割があります。
ブロックを引数にするメリット
ブロックをほかのメソッドに引き渡すことができます。
def playing_guitar(&block) sounds = ['ギュイーン', 'ガガガッ', 'ジャラーン'] playing_tech(sounds, &block) end def playing_tech (sounds, &block) puts sounds[1] puts block.call(sounds[0]) puts sounds[2] end playing_guitar do | sound | sound * 3 end #=> ガガガッ #=> ギュイーンギュイーンギュイーン #=> ジャラーン
callメソッド
Proc とは
Procは、Procedureから来ています。プログラミングにおいて複数の処理をひとつにまとめたものです。手順、手続き。一連の処理を意味を持った一まとまりにすることで、再利用性が高まり、プログラム中に繰り返して現れる処理を一ヶ所で記述でき、プログラムの管理を容易にするしくみです。
Procクラスは、ブロックをオブジェクト化するためのクラスです。ブロック、つまり「何らかの処理(何らかの手続)」を表します。Procオブジェクトを実行したい場合は、callメソッドを使います。
shout = Proc.new { 'Hey!Ho!Let\'s go!' } #=> #<Proc:0x00007fd79c995248 (irb):1> shout.call #=> "Hey!Ho!Let's go!"
Proc.newとラムダの違い
->
または、lamda
メソッドで、Procオブジェクトを作ることができます。このような呼び出しで作成したProcオブジェクトを「ラムダ式」と呼びます。
単純な呼び出しでは、Proc,newもラムダも引数の扱いに違いはありません。
add_lambda = ->(a, b) { a + b } add_lambda.call(100,500) #=> 600 add_lambda = lambda { |a, b| a + b } add_lambda.call(10,50) #=> 60
しかし、ラムダの場合はメソッドの呼び出しと同じように引数の数に過不足があるとエラーが発生します。ラムダの方が引数のチェックが厳密になります。
add_lambda = lambda { |a, b| a + b } add_lambda.call(10, 20, 30) # エラーが発生。引数がひとつ多い。 wrong number of arguments (given 3, expected 2) (ArgumentError)
[1, 2, 3].map(&:to_s)イディオム
AtCoderなどでよく使っているイディオムです。
以下、map(&:upcase)
と書くことで、Procオブジェクトに変換し、mapメソッドにブロックとして渡すことができます。
[ 'guitar', 'bass', 'drums' ].map { |s| s.upcase } #=> ["GUITAR", "BASS", "DRUMS"] [ 'guitar', 'bass', 'drums' ].map(&:upcase) #=> ["GUITAR", "BASS", "DRUMS"]
Rubyの公式リファレンスが読めるようになる本
9月3日にZenで公開された伊藤さんの本を読みました。
とても良かったです!
当時は、るりまに書かれていることが「意味がwakaran」の連続で、相当苦しめられました…。
冒頭の説明にもあるように、「ネットの技術記事より公式リファレンスを読め!」とよく指摘されていたましたが、そのるりま自体の意味わからんのですが....と、ずーっと思っていました。
今は、輪読会やプラクティス等で試行錯誤し取り組んできたおかげで、るりまが少しづつ読めるようにはなってきましたが、当時この本で事前に学べていたら、るりまとの向き合い方が全然変わっていたと思いますし、学習効率の向上や必要ない遠回りをせずに済んだと思います。その当時に思い悩んで詰まっていたポイントの解説が満載で、初心者には間違いなく救いの本となると思います。
今からRubyを始める方には、ぜひとも読んでいただきたい!
そんな一冊です!!
参考書籍
- 伊藤淳一 著/『プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで』/技術評論社/2017年https://gihyo.jp/book/2017/978-4-7741-9397-7
- 五十嵐邦明,松岡浩平 著/『ゼロからわかる Ruby 超入門』/技術評論社/2018年https://gihyo.jp/book/2018/978-4-297-10123-7
- 高橋征義、後藤裕蔵 著/『たのしいRuby第6版』/SBクリエイティブ/2019年https://tanoshiiruby.github.io/6/index.html
- プログラミング言語 Ruby リファレンスマニュアル https://docs.ruby-lang.org/ja/
🍒 まとめ
だいぶ間が空いてしまいましたが第15週目のブログを書きました。
残り2週!
では、また!(次回、第16週目)