From: matz@... (Yukihiro Matsumoto) Date: 1997-05-22T13:32:46+09:00 Subject: [ruby-list:2999] Re: access to instance variable まつもと ゆきひろです In message "[ruby-list:2998] Re: access to instance variable" on 97/05/22, toyofuku@juice.or.jp writes: | 豊福@パパイヤです。 |> あー,TABSTOPはクラス定数を定義していて,attrはアクセサを定 |> 義しているので良いのですが,その次の行はBufferクラスオブジェ |> クトそのもののインスタンス変数を設定しています. | | いわゆるクラス変数にあたるわけですかね。 ちょっと違うんですね.どこが違うかというとクラス変数は通常の メソッドからもアクセスできるが,クラスオブジェクトのインスタ ンス変数はクラスの定義本体かクラスメソッドの中からしかアクセ スできないんです. 通常のオブジェクト指向言語でクラス変数に該当するものはrubyで はクラス*定数*です. |それではこれならどうだと | | class Buffer | attr :default_tabstop, TRUE | @default_tabstop = 8 | attr :tabstop, TRUE | def initialize | @tabstop = @default_tabstop | # @tabstop = Buffer.default_tabstop | end | end | | x = Buffer.new | |を試したところ x.tabstop は nil でした。 |@tabstop = Buffer.default_tabstop の方でやると |ERR: undefined method 'default_tabstop' for Buffer(Class) |でした。 上述の理由により@default_tabstopがアクセスできないからです. またattrはメソッドは定義しますが,クラスメソッドは定義しませ ん. | 今度のはどうまずいんでしょう。 rubyはクラスをあんまり特別扱いしていないんですが,その辺が引っ かかっているのではないでしょうか.C++使いにはメソッドとクラ スの特異メソッド(クラスメソッド)でスコープが相当違うのが戸惑 うかも知れません. まつもと ゆきひろ /:|)