• ベストアンサー

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! になるのですが、これが理解できません。 上手く説明してくれませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

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) という書法が出来たわけですが。

kingfruits
質問者

補足

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"}と書きましたが、値が渡らないようでした。 不思議な感じがします。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

> 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++きらいだけど:)

kingfruits
質問者

お礼

判ってきました。ありがとうございました。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

ヘンなコードなので理解できなくても良さそうですが。 def[]=(x,y) ... end が「演算子」を定義しており、クラス Foo のインスタンス bar について bar[x] = y の定義を与えていることだけです。

kingfruits
質問者

補足

[x] = y を定義するとき、def []=(x,y)と記述するんですか? そういうモンなんですか?

関連するQ&A