blog.waterlow.work

Ruby, Rails, js, etc...

【Ruby】クラスを作るということ2

前回のまとめ

Rubyにおけるクラスとは?
 →インスタンスである。詳しく言えばClassクラスのインスタンス
  クラスクラス定義を混同しない。

6-2クラスオブジェクト

クラスオブジェクトとは上に書いたことそのままだけど、言い方を変えれば"クラス"という名前の(Classクラスの)オブジェクトという意味なのか?これは字面だけでは理解した気になれないから、手を動かしていろいろ自分の思うように作ってみると良い。

クラスインスタンス変数
Rubyインスタンス変数とは

class DataSet
  def initialize
    @data0 = 0
    @data1 = "1"
  end
  attr_accessor :data0
  attr_accessor :data1
end

こんな風に定義するのでしょうか。クラス定義式内で@をつけて宣言するorアクセサを書く。
インスタンス変数はインスタンスの情報を保持する変数のこと。
とすればクラスインスタンス変数は各クラスインスタンスの情報を保持する変数となるはず。
うん…よくわからない!

クラス変数とクラスインスタンス変数の大きな違いとしては

class DataSet
  @calss_instance_val = :class_instance_val
  @@class_val = :class_val

  def instance_method
    p @class_instance_val
    p @@class_val
    #class_valは見える。class_instance_valは見えない。
  end
end

dataset = DataSet.new
dataset.instance_method

インスタンスメソッドからの可視性が異なるらしい。ただ、そもそもなんとなく似ていそうな気はするが作りは全然別物だから結びつけて考えるのは間違いな気がする(個人的感想だけど)…
使い所としては、そのクラスに閉じた(サブクラスには渡したくない)情報を保持したいときに使うみたいです!

クラスメソッド
Classインスタンスの特異メソッドのこと。selfを自身のクラス名に書き換えるとよく分かる。

class DataSet
end

def DataSet.class_method
  :class_method
end

p DataSet.class_method

メソッド定義
メソッド定義もClassクラスのスーパクラスであるModuleクラスのメソッドを使えばできる。

class DataSet
  define_method :instance_method, -> {:defined}
end

dataset = DataSet.new
puts dataset.instance_method #=>defined

モジュールのメソッドをincludeしたことを明示化するためにも(?)define_methodは使えるけれど、複雑なので忘れることにした。

次回は特異クラスの勉強です。