「class_evalメソッド」
class_evalメソッドという厳ついメソッドを使わざるを得ない場面があった。 初見かつ苦手なモジュール関連のメソッドだったので復習としてまとめておこうと思う。
class_evalメソッドはそもそもRubyの標準クラス・モジュールのメソッドである。
正式には
class_evalメソッドは、ブロックをクラス定義やモジュール定義の中のコードであるように実行します。ブロックの戻り値がメソッドの戻り値になります。 Rubyリファレンス
具体例
class Greet end Color.class_eval { def hello; "hello" ;end }
🐤
オブジェクトのprivateメソッド
p , print , putsはObjectクラスのPrivateなメソッド。 よってクラスを定義した時に、Object,Kernel,BasicObjectが継承関係に取り込まれ、レシーバが省略される。
Object.private_methods.grep(/p/) => [:public, :protected, :private, :initialize_copy, :prepended, :sprintf, :loop, :Complex, :suppress, :open_uri_original_open, :sleep, :polyglot_original_require, :respond_to_missing?, :open, :printf, :print, :putc, :puts, :p, :initialize_dup, :pp, :proc, :trap, :spawn]
🐤
モジュール基礎の基礎
①ミックスイン(include) クラスでモジュールをincludeするとモジュールで定義したメソッドが、インスタンスメソッドとして使える。
module Beep def boo puts "boo" end end class Car include Beep end class Plane include Beep end car = Car.new car.boo #=> "boo" plane = Plane.new plane.boo #=> "boo"
②ミックスイン(extend) extendの場合は、モジュール内のメソッドをクラスメソッド(該当クラスの特異メソッド)として使う事ができるようになる。
module Beep def boo puts "boo" end end module Bump def bump puts "bump" end end class Car extend Beep extend Bump end class Plane extend Beep end Car.boo #=> "boo" Car.bump #=> "Bump" Plane.boo #=> "boo"
名前空間とか、難しいやつは次回🐤