- ベストアンサー
Ruby
#!/usr/local/bin/ruby class Foo def []=(x,y) print "Hello,",x,y,"!\n" end end bar = Foo.new bar["wor"] = "ld" 上記実行結果は Hello world! になるのですが、これが理解できません。 上手く説明してくれませんか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
def a(x,y) print "Hello,",x,y,"!\n" end はお分かりですよね。 def []=(x,y) print "Hello,",x,y,"!\n" end も全くそれと同じです。 呼び出し方も、bar.a("wor","ld") とか bar.[]=("wor","ld") と全く同じです。 後者の簡易的な書き方が、bar["wor"] = "ld" ということです。 まあ、本当は話は逆で、ArrayやHashの要素の更新っぽく書く記法をプログラマが自分で自由に定義できる書法を、一般のメソッド定義の延長で書くにはどうしたらいいかという発想で、def []=(x,y) という書法が出来たわけですが。
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
> ArrayやHashの要素の更新っぽくって事で、トップレベルに > bar={"wor"=>"ld"}と書きましたが、値が渡らないようでした。 これだと bar はハッシュになりますが、どこに値が渡らないと 悩んでるのでしょうか? class Foo とは無縁になるのでFooのメソッドは呼ばれません。 >irb irb(main):001:0> class Foo irb(main):002:1> def []=(x,y) irb(main):003:2> print "Hello,",x,y,"!\n" irb(main):004:2> end irb(main):005:1> end => nil irb(main):006:0> bar = Foo.new => #<Foo:0xa47b08> irb(main):007:0> bar["wor"] = "ld" Hello,world! => "ld" irb(main):008:0> p bar.class Foo => Foo irb(main):009:0> bar={"wor"=>"ld"} => {"wor"=>"ld"} irb(main):010:0> p bar.class Hash => Hash irb(main):011:0> あと >def [x]=yの代わりにdef []=(x,y)と書くと理解しても良いものでしょうか? そういうことです。 C++をご存知なら operator[]() みたいなもんです。という説明でわかるかな? #まつもとさんはC++きらいだけど:)
お礼
判ってきました。ありがとうございました。
- koko_u_
- ベストアンサー率18% (459/2509)
ヘンなコードなので理解できなくても良さそうですが。 def[]=(x,y) ... end が「演算子」を定義しており、クラス Foo のインスタンス bar について bar[x] = y の定義を与えていることだけです。
補足
[x] = y を定義するとき、def []=(x,y)と記述するんですか? そういうモンなんですか?
補足
bar.[]=("wor","ld") をbar["wor"] = "ld"と書いてもイイって事なんですね。 def [x]=y print "Hello,",x,y,"!\n" end とは書けないので、def [x]=yの代わりにdef []=(x,y)と書くと理解しても良いものでしょうか? ArrayやHashの要素の更新っぽくって事で、トップレベルに bar={"wor"=>"ld"}と書きましたが、値が渡らないようでした。 不思議な感じがします。