Roll With IT

tamakiのIT日記

チェリー本輪読会 第15週目まとめ

f:id:shirotamaki:20210619091936p:plain

🍒 はじめに

チェリー本輪読会の第15週目のエントリーになります。

輪読会の概要については第1週目にまとめています。

🍒 輪読会 第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オブジェクトへ変換する役割があります。

qiita.com

ブロックを引数にするメリット

ブロックをほかのメソッドに引き渡すことができます。

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メソッド

docs.ruby-lang.org

Proc とは

Procは、Procedureから来ています。プログラミングにおいて複数の処理をひとつにまとめたものです。手順、手続き。一連の処理を意味を持った一まとまりにすることで、再利用性が高まり、プログラム中に繰り返して現れる処理を一ヶ所で記述でき、プログラムの管理を容易にするしくみです。

ja.wikipedia.org

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の公式リファレンスが読めるようになる本

zenn.dev

9月3日にZenで公開された伊藤さんの本を読みました。

とても良かったです!

当時は、るりまに書かれていることが「意味がwakaran」の連続で、相当苦しめられました…。

冒頭の説明にもあるように、「ネットの技術記事より公式リファレンスを読め!」とよく指摘されていたましたが、そのるりま自体の意味わからんのですが....と、ずーっと思っていました。

今は、輪読会やプラクティス等で試行錯誤し取り組んできたおかげで、るりまが少しづつ読めるようにはなってきましたが、当時この本で事前に学べていたら、るりまとの向き合い方が全然変わっていたと思いますし、学習効率の向上や必要ない遠回りをせずに済んだと思います。その当時に思い悩んで詰まっていたポイントの解説が満載で、初心者には間違いなく救いの本となると思います。

今からRubyを始める方には、ぜひとも読んでいただきたい!

そんな一冊です!!

参考書籍

🍒 まとめ

だいぶ間が空いてしまいましたが第15週目のブログを書きました。

残り2週!

では、また!(次回、第16週目)