【Ruby】クラスを作るということ2
6-2クラスオブジェクト
クラスオブジェクトとは上に書いたことそのままだけど、言い方を変えれば"クラス"という名前の(Classクラスの)オブジェクトという意味なのか?これは字面だけでは理解した気になれないから、手を動かしていろいろ自分の思うように作ってみると良い。
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は使えるけれど、複雑なので忘れることにした。
次回は特異クラスの勉強です。