From: Dai Date: 1999-09-06T21:13:44+09:00 Subject: [ruby-list:16527] Re: symbol (Re: Re: 人材募集 (Re: Re: Ruby Workshop)) かんだでし。 % えー、嘘入ってるかもしれんです(^^; Yamada Kenji さんの書かれた、 「[ruby-list:16521] Re: symbol (Re: Re: 人材募集 (Re: Re: Ruby Workshop))」 からの引用です。 > 山田@日立(電サ)です. > うーむ,とりあえず,インスタンス変数へのアクセスは > メソッド経由でないとダメ. > attr はインスタンス変数へアクセスするためのメソッドを定義する. > って理解でいいと思っているんですが,リファレンスマニュアル > に書かれている"属性"と"アクセスメソッド" のうち"属性" > っていうのはどう理解したらいいんでしょう. アクセスメソッドでアクセスされるのが属性です:) 一般的にオブジェクトで属性というと、オブジェクトの状態を表すもののこと ですね。ruby ならインスタンス変数と同義でいいと思います。 % ちゃんとした話は知らないんで、嘘言ってるかも…(^^; > > attr でいうと、インスタンス変数 @foo を指定したい場合は、:foo を用い > > ます。 > > > > attr_reader(:foo) > > attr("foo", FALSE) > > def foo; @foo; end > > > > は同じ意味です。ちなみに、 > > > > p :foo > > p "foo".intern > > > > も同じです。合わせて次もご賞味ください:) > > > > p :foo.id2name > C でいうところの構造体のポインタで (*a).var を > a->var で書くみたいなイメージかな? ちょっと違う感じだなー たぶん、話がごっちゃになってますね。 属性(インスタンス変数)とシンボルは本来関係ない概念です。 属性でもメソッドでも、とにかくそれをそれと特定する名前がシンボル。言語実 装のハナシですね。いちいち内部で "foo" とかいう文字列を使ってたら効率悪く てたまらないので整数使ってるのでしょう。 > なぜ理解できないのか説明するのが難しいのですが, > "attr foo" ではダメで "attr :foo" でないとならない理由が > 消化できていないんです. これはですね、attr の位置の都合でしょうか? class A attr_reader @foo end と書いた場合、この @foo はクラスAのインスタンス変数でなくて、クラスオブ ジェクトA のインスタンス変数になります。 % ちょっと前にもこの話題出てたよーな気がする…。 では、と class A attr_reader foo end と書くと…、この foo は ruby の文法的には foo という変数になりそう。 A に foo のアクセスメソッドを定義してくれって指示する場合、 「この foo をアクセスしてくれ」 と頼むか、 「foo というものをアクセスしてくれ」 と頼むか方法がありますが、↑の例は前者のやり方ですよね。ただ、A のコンテキ スト中では、A のインスタンス変数というものをうまく扱えません。 というわけで、「foo というもの」を指定するわけですけれど、それは ruby としてはシンボルを使います、と。同等な名前文字列でもいいですけど。 ちなみに def はどうかというと…。 class A def foo; end end これは文法的に特別だからです。parse.y みてみると、 | kDEF fname { ... } f_arglist compstmt kEND { $$ = NEW_DEFN($2, ...) ... } となっていて、この $2(=fname) は文字列(つまりシンボルと同等)ですね。 % あってます?(^^;;;; だから、 attr_reader foo の foo を def のメソッド名と同様に解釈するには、attr_reader という文法 要素を加えなくちゃいけないわけです。 % attr_reader は Moduleクラスのメソッド。 ちなみに、undef_method() というメソッドが Module クラスに定義されていま すが、この引数もシンボルです。他の Module のメソッドも同様ですね。 と断言してますが、実はここまでくると半信半疑です(^^; どなたかフォローおねがい。 -- 神田@楓街 MAP2303@mapletown.net 紅玉軌道異変アリ。