アプリ版:「スタンプのみでお礼する」機能のリリースについて

#!/usr/local/bin/ruby
class Foo
def []=(x,y)
print "Hello,",x,y,"!\n"
end
end
bar = Foo.new
bar["wor"] = "ld"

上記実行結果は
Hello world!
になるのですが、これが理解できません。
上手く説明してくれませんか?

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

この回答への補足

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

補足日時:2007/10/24 11:55
    • good
    • 0

> 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++きらいだけど:)
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/10/26 13:27

ヘンなコードなので理解できなくても良さそうですが。



def[]=(x,y)
...
end

が「演算子」を定義しており、クラス Foo のインスタンス bar について
bar[x] = y の定義を与えていることだけです。

この回答への補足

[x] = y
を定義するとき、def []=(x,y)と記述するんですか?

そういうモンなんですか?

補足日時:2007/10/22 21:42
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!