りゅうじの学習blog

学習したことをアウトプットしていきます。

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));

参考

Ruby超入門

プロを目指すRuby入門

現場で使えるRubyonRails

class NilClass