Ruby

クラス変数/クラスインスタンス変数/インスタンス変数

クラス変数
 C++で言うところのstaticメンバ変数。

クラスインスタンス変数
 クラス変数とほぼ同じだが、継承されない。そのクラスだけのクラス変数。

インスタンス変数
 C++で言うところのメンバ変数。

+ example...
class Hoge
  @@class_var = 1  # クラス変数
  @class_instance_var = 2  # クラスインスタンス変数
  def initialize
    @instance_var = 3  # インスタンス変数
  end
end
 

クラスメソッド/インスタンスメソッド

クラスメソッド
 C++で言うところのstaticメンバ関数。クラスオブジェクトの特異メソッドとして定義する。

インスタンスメソッド
 C++で言うところのメンバ関数。

+ example...
class Hoge
  def Hoge.foo  # クラスメソッド(def self.fooでも可)
  end
  def fuga  # インスタンスメソッド
  end
end
 

privateメソッド/protectedメソッド

privateメソッド
 外部から呼び出すこと(インスタンスをレシーバとした呼び出し方)はできない。
 ただし、C++とは異なり、派生クラス内から呼び出すことができる。(C++のprotectedのような感じ?)

protectedメソッド
 よくわからん。
 基本的にはprivateメソッドと同様、外部からは呼び出せず派生クラスからは呼び出すことができる。
 ただし、レシーバ指定の呼び出し方ができる点がprivateメソッドと異なるらしい。

メソッドのオーバーロード

 できない。
 デフォルト引数を使ってごまかす。

initializeメソッド

 newメソッドから呼ばれる。可視性はprivate。
 C++のコンストラクタとは異なり、派生クラスをnewした時、基本クラスのinitializeメソッドは呼ばれない(派生クラスのinitializeメソッドは基本クラスのinitializeメソッドをオーバーライドしたもの)。基本クラスのinitializeメソッドを実行したい場合は、superで明示的に呼ぶ必要がある。
 派生クラスでinitializeメソッドを明示的に定義しなかった場合、基本クラスのinitializeメソッドが呼ばれる。

superメソッド

 superとsuper()は異なる
 superは、オーバーライドしているメソッドの引数をオーバーライドされているメソッドにわたす。
 super()は、引数なしでオーバーライドされているメソッドを呼び出す。

+ example...
class Foo
  def initialize(arg=0)
  end
end
class Bar < Foo
  def initialize(arg)
    super    # Foo::initialize(arg)が呼ばれる. super(arg)と書くのと同じ.
    super()  # Foo::initialize()が呼ばれる.
    arg = 10
    super    # Foo::initialize(10)が呼ばれる.
end
 

列挙型

 Rubyに列挙型(enum)は準備されていない。enumの実現にはシンボルを用いるのが一般的らしい。
 C++のenumのように利用したい場合、シンボルをmodule定数にしてしまえばよい。

+ example...
module FRUIT
  APPLE  = :APPLE
  ORANGE = :ORANGE
end
# FRUIT::APPLE, FRUIT::ORANGEのようにして使う.
 


コメント

最終更新:2011年09月16日 22:23