2022年3月15日Rubyの知識の復習
Rubyの復習
Ruby超入門・プロを目指すRuby入門・現場で使えるRubyonRailsを読みながら復習していっています。
クラスメソッドとインスタンスメソッドの使い分け
クラスメソッド
- クラス全体に関わる情報を変更したり 参照したりするメソッドを作成するとき使用します。
インスタンスメソッド
- 個別のインスタンスに関わる情報を変更したり 参照したりするメソッドを作成するときに使用します。
&:メソッド名の記法について
- &: メソッド名は& と :メソッド名
- & はアンパサンドと読む
- {} と書いてブロックを渡すところを & と書いてProcとしてブロックをオブジェクト化して使っている。
names = users.map do |user| user.name end # この二つが同義 names = users.map(&:name)
本当にできるかPaizaで検証
asakai = ["yuki", "yui", "yano", "yuno"] p asakai.map(&:upcase) # => ["YUKI", "YUI", "YANO", "YUNO"]
できています。
Procとlambda
どちらもProcオブジェクトを生成します。
Procオブジェクトとは
ブロックをオブジェクトとして扱えるようにしたオブジェクトです。 オブジェクトとして扱えるので、変数に入れて別のメソッドに渡すことができます。
lambdaにはリテラルがあります
-> (a) { a + b } # この二つは同義です。 lambda { |a| a + b }
Procからインスタンス化する事でも生成できます。
proc = Proc.new
どちらもProcオブジェクトを生成するが違いについて
Procは仮引数の数と実引数の数が一致していなくてもエラーにならずに実行できるし実引数が渡った通りの返り値になる。 lambdaは仮引数と実引数の数が一致していないとエラーになる。 あと、returnとbreak時の挙動の違いもあるが、使わないパターンを検討するべきなのでここでは割愛します。違いがあるという認識は持ちましょう。(詳しく知りたい方はプロを目指すRuby入門 P391参照)
引数にnilが渡ったときにエラーにさせないようにするテクニック
a = nil b = a.to_i + a.to_i p b # => 0
- aは
nil
なのでそのままではエラーになるが、to_iメソッドで0にしているので0 + 0
が行われるのでエラーになりません。 - メソッドの場合、仮引数にto_iメソッドを使用すれば実引数に
nil
があってもエラーにならないメソッドにできます。
どうして実現できているか?
def num(a, b) puts(a.class) # => Integer puts(b.class) # => NilClass a.to_i + b.to_i end puts(num(1, nil));
- class NilClassの
to_i
メソッドは0
を返します。
参考
Ruby超入門
プロを目指すRuby入門
現場で使えるRubyonRails