From: "NAKAMURA, Hiroshi" Date: 2002-02-25T16:47:44+09:00 Subject: [ruby-dev:16067] Re: New Struct なひです。 class Hash def method_missing( msg_id, *a, &b ) self[ msg_id ] || self[ msg_id.id2name ] end end def foo return "foo" => 1, :bar => 2 end 。。。みたいなお遊びは本題ではありません。 > From: Shin-ichiro HARA [mailto:sinara@blade.nagaokaut.ac.jp] > Sent: Monday, February 25, 2002 3:53 PM > >でも、いきなり > >インスタンス作る(で、そのインスタンスのクラスのメンバ定義は > >忘れちゃう)というのは、いくら分かり易くても、 > >実際にはあまり使われなさそうな気がします。 > > 鋭い指摘。しかし各メンバに何にも関連がない時、インスタンスの属 > するクラスには興味がないですよね。例えば、これが使われる場面と > しては、メソッドの出入り口で、 > > return "matz", 104 > > の代わりに > > return Struct(:name => "matz", :age => 104) > > みたいに使うことを主に考えていのです。だから、メンバ定義は > むしろメソッドの仕様に属するので、忘れられないわけ。 メソッドの入り口に関してはキーワード引数で解決されそうですね。 出口については確かにそういう用途はありそうな気がします。 個人的には、外からは見えない型が返ってくるとなんかどきどき しちゃうんですが。。。染まってんのかな。 この用途なら原さんが最初に書かれているように、 クラスを作るよりオブジェクトひとつ作って特異メソッドで respond_to?を保障するというやり方がよさそうに思います。 keyをSymbol or Stringに固定してHash#{key}でアクセスできる YAHashがあればよい? def foo return YAHash[ :name => "matz", :age => 104 ] end それにYAHashなんてあんまりな名前じゃなくStructという名前を付けると return Struct[ :name => "matz", :age => 104 ] となって、原さん案にちょっと近いかも。