ホーム :その2 :クラスとモジュール :

【クラスを作る】

前へ 次へ


(例)
--------------------------------------------------------------------------
class HelloWorld                # class文
 def initialize(myname="Ruby")        # initializeメソッド
  @name=myname                # インスタンス変数の初期化
 end
 def hello                  # インスタンスメソッド
  print "Hello, world. I am ", @name, ".\n"
 end
end


bob = HelloWorld.new("Bob")
alice = HelloWorld.new("Alice")
ruby = HelloWorld.new

bob.hello
--------------------------------------------------------------------------

●class文

 
 class クラス名
  クラスの定義
 end
 


 ※クラス名は、必ず大文字で始めなければならない。


●initializeメソッド

 newメソッドによってオブジェクトを生成すると、initializeメソッドが
 実行される。

 bob = HelloWorld("Bob")

 オブジェクトを生成すると、initializeメソッドに"Bob"が渡される。
 引数を渡さなかった場合、自動的に"Ruby"が渡される。


●インスタンス変数とインスタンスメソッド

 @で始まる変数をインスタンス変数という。

 インスタンス変数はインスタンスメソッドから参照することが可能。


●アクセスメソッド

 インスタンス変数にアクセスするためにメソッドを定義する必要がある。


 (例)
 class HelloWorld
   :
  def name
   return @name
  end
  def name=(value)
   @name = value
  end
 end


アクセスメソッドの定義

 ┌──────────┬─────────────────────────┐
 │定義        │意味 │
 ├──────────┼─────────────────────────┤
 │attr_reader :name  │参照のみ可能にする(nameメソッドを定義する) │
 │attr_writer :name  │変更のみ可能にする(name=を定義する) │
 │attr_accessor :name │参照と変更の両方を可能にする(上記2つを定義する)│
 └──────────┴─────────────────────────┘


●クラスメソッド

 クラスメソッドの定義の仕方
 (a)
 「def クラス名.メソッド名 〜 end」と書く場合

 class HelloWorld
  def HelloWorld.Hello(name)
   print name, "said hello.\n"
  end
 end
 HelloWorld.hello("John")

 (b)
 「class << クラス名 〜 def メソッド名 〜 end end」と書く場合
 class HelloWorld
   :
 end
 class << HelloWorld
  def Hello(name)
   print name, "said Hello.\n"
  end
 end
 HelloWorld.hello("John")

 (c)
 「class クラス名 〜 def self.メソッド名 〜 end end」と書く場合
 class HelloWorld
  def self.hello(name)
   print name, "said hello.\n"
  end
 end
 HelloWorld.hello("John")


●定数

 class HelloWorld
  Version = "1.0"
 end

 p HelloWorld::Version   #=> "1.0"


●クラス変数

 「@@」で始まる変数。
 そのクラスのすべてのインスタンスで共有できる変数。

 (例)
 class HelloCount
  @@count = 0

  def HelloCount.count
   @@count
  end

  def initialize(myname="Ruby")
   @name = myname
  end
  def hello
   @@count += 1
   print "Hello, world. I am ", @name, ".\n"
  end
 end

 bob = HelloCount.new("Bob")
 alice = HelloCount.new("Alice")
 ruby = HelloCount.new

 p HelloCount.count     #=> 0
 bob.hello
 alice.hello
 ruby.hello
 p HelloCount.count     #=> 3


●クラスの拡張

 すでに定義されているクラスにメソッドを追加することも可能。

 (例)
 -------------------------------------------------
 class String
  def count_word
   ary = self.split(/\s+/)
   return ary.size
  end
 end

 str = "Just Another Ruby Newbie"
 p str.count_world
 -------------------------------------------------


●継承

 既存のクラスに変更を加えず、新しい機能を追加したり、部分的に
 カスタマイズしたりして新しいクラスを作成する。


 class クラス名 < スーパークラス名
  クラスの定義
 end


 (例)
 ----------------------------------------------------------
 class RingArray < Array
  def [](i)
   idx = i % size
   super(idx)
  end
 end

 eto = RingArray[[ "子", "丑", "寅", "卯", "辰", "巳",
          "午", "未", "申", "酉", "戌", "亥"]

 p eto[6]    #=> "午"
 p eto[11]    #=> "亥"
 p eto[15]    #=> "卯"
 p eto[-1]    #=> "亥"


●メソッドの呼び出し制限

 ・public
  メソッドをインスタンスメソッドとして使えるように公開する

 ・private
  メソッドをクラスの内部だけで使えるようにする
  (レシーバを指定してよびだせないようにする)

 ・protected
  メソッドをクラスの内部から使えるようにする。また、同一
  クラスないではインスタンスメソッドとしても使えるようにする


クラスとモジュール に戻る