メメメモモ

プログラミング、筋トレ、ゲーム、etc

Rubyについて調べた事メモ

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