Rubyのソースコードを読んでいる途中で分からなかった事柄について調べたことのメモです。
attr_reader, attr_writer, attr_accessor
メンバ変数のアクセサを作成します。
class Class1 attr_reader :a attr_writer :b attr_accessor :c end m = Class1.new() p m.a # m.a = 7 -> error m.b = 7 # p m.b -> error m.c = 7 p m.c
self.class
「self.class」は、selfのクラス名になります。
class Class1 def print p self.class end end class Class2 < Class1 end c1 = Class1.new c2 = Class2.new c1.print #-> Class1 c2.print #-> Class2
allocate
インスタンスを生成します。
newとは違うところは、変数に入っているクラス名のインスタンスを生成しているところ?
class Class1 def create_instance self.class.allocate # self.class.new とはできない end end
block_given?とyield
下記のように呼び出す関数を「ブロック付き関数」と呼びます。
foo{|arg| puts "given block. arg=#{arg}" }
この時のfoo関数の定義において「block_given?」と「yield」を使用します。
block_given?は、ブロックが渡されたかどうかを調べます。
yieldは、渡されたブロックを実行します。
def foo if block_given? yield("hoge") else p "no block." end end foo #-> no block. foo{|arg| puts "given block. arg=#{arg}" } #-> given block. arg=hoge