• ベストアンサー

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% (4843/10252)
回答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

  • Ruby インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶ

    #!/usr/bin/ruby def foo(arg) arg.upcase end def bar(arg) arg.upcase end class Foo attr_reader :foo def initialize(arg) @foo = foo(arg) #@foo = bar(arg)とすれば期待した結果が得られる end end f=Foo.new("hoge") puts f.foo 上記実行するとエラーになります。 Class Fooの中のでfooといえば、インスタンス変数@fooであって、関数のfooではないって事なのでしょうか。 インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶことはできないのでしょうか?

  • rubyのファイルを実行できません。

     Debian(Woody)の環境です。 #find ./ -name ruby ./usr/bin/ruby ./usr/share/doc/ruby ./usr/doc/ruby ./usr/lib/ruby があり、/usr/binにrubyのファイルが確認できます。 $ruby -v ruby 1.6.7 (2002-03-19) [i386-linux] が出ます。pathが通っています。 $ ruby -e 'print "hello World\n"' で hello World もちゃんどでます。 しかし、vi hello.rbで、中には ------------------- #!/usr/bin/ruby print "Hello World!\n" --------------------- と、実行権-rwxr-xr-xにします。 %hello.rb では: bash: hello.rb: command not found が出て,実行できませんでした。 ファイルの中に、#!/usr/lib/rubyに代えてもおなじでした。  因みに %env で ... PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11 ... がでます。  アドバイスをよろしくお願いします。

    • 締切済み
    • CGI
  • Rubyのsuperclassメソッドについて

    Rubyについての質問です。処理系は1.8.7です。 class Foo def initialize(a) @a = a end end のようなクラスを作成し、そのインスタンスを foo = Foo.new(1) のように作成します。 このとき、 foo.superclassを呼び出すと NoMethodError: undefined method `ancestors' for #<Foo:0x2b691220cc88 @a=1> とエラーになります。 一方で class FooExt < Foo def initialize (a,b) @b = b super a end end のようにFooを継承したクラスを作り、 fooext = FooExt.new(1,2) fooext.superclass とすると => Foo とsuperclassメソッドが動作します。 このsuperclassメソッドはどこで追加されたものなのでしょうか?

  • Ruby の 文法に困ってます。

    以下のようなソースの場合、to_sメソッドは何時呼ばれているのでしょうか。またどういう意味を成しているのでしょうか。 Ruby初心者のためご教授頂けないでしょうか。 よろしくお願いします。 class Vector   attr_accessor :x, :y   def initialize(x=0, y=0)     @x = x     @y = y   end   def length     Math::sqrt(@x ** 2 + @y ** 2)   end   def to_s      "(#{@x},#{@y})"   end   def <=> other     length <=> other.length   end end arr =[] arr << Vector.new(2,2) arr << Vector.new(3,2) arr << Vector.new arr.sort.each do |item|   puts item end 結果は以下になります。 (0,0) (2,2) (3,2)

    • ベストアンサー
    • Ruby
  • Rubyの構文?言語仕様?

    Rubyの以下コードについて質問です。 #!/ruby/bin/ruby print "content-type: text/html\r\n\r\n"; puts "Hello World!" begin def foo x =0 (0...10).each do |value| print value.to_s +"の時"+ x.to_s + "<br />" end end foo rescue =>e print e.class.to_s+ "<br />" print e.message end 上記コードを実行すると以下のような例外を取得します NoMethodError undefined method `+@' for "\343\201\256\346\231\202":String どうやら上記コードの print value.to_s +"の時" の部分の  +"の時" という箇所が問題のようなのですが 上記箇所を + "の時" のように 文字列連結子の +と "の間に半角スペースを 入れるとうまく実行されます。 いったい原因はなんなのでしょうか? 細かい箇所ですが是非、ご教授ください。

    • ベストアンサー
    • Ruby
  • Module#method_addedの挙動

    すいません、Rubyのドキュメントを見ながら動作を追っていて、疑問に感じたので質問をさせてください。 Module#method_addedというメソッドが追加されたタイミングで動作するメソッドがあります。 定義場所がModuleクラスの中なので、Moduleにメソッドを追加したら、それがmethod_addedを呼び出すと思って試して見たのですが、何故かそうなりません。 何故なのか理由がわからないんですが、教えていただけないでしょうか? ------------------------------------------------------------------ class Object def self.method_added(*_) p self.class.name p __method__ p _ end def self.singleton_method_added(*_) p self.class.name p __method__ p _ end end class Module def self.method_added(*_) p self.class.name p __method__ p _ end def self.slngleton_method_added(*_) p self.class.name p __method__ p _ end end module Foo def self.foo end def foo2 end end class Bar def self.bar end def bar2 end end ------------------------------------------------------------------ 出力結果 ------------------------------------------------------------------ "Class" :singleton_method_added [:bar] "Class" :method_added [:bar2] ------------------------------------------------------------------ 動作環境は、Mac rubyのバージョンは2.4.0です。 ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]

    • ベストアンサー
    • Ruby
  • syntax error 一行で書くと

    複数行で記述してあった箇所を、試しに一行にしてみたら、syntax errorとなりました。 改行した方が見やすいとは思うのですが、一行で書くときは、どうやればよいのでしょうか。 ■正常に動く class Foo __def print3 ____yield(1,2) __end end foo=Foo.new foo.print3{|x,y //この部分を一行にしてみたかったのですが、 __print x,"\n" __print y,"\n" } ■エラーとなる class Foo __def print3 (略) foo.print3{|x,y|print x,"\n" print y,"\n"} //←この行を直したいのですが、 (irb): syntax error, unexpected tIDENTIFIER, expecting '}'

    • ベストアンサー
    • Ruby
  • Rubyのプログラム

    今、サンプルとしてこれがあるんですけど、これは交点を出力するものなんですが、線を出力するにはどこを変えればよいですか?? Xみたいに線を描きたいです。 class Ten def initialize(x, y) @x = x # インスタンス(@がついているもの)変数に代 入 @y = y # インスタンス(@がついているもの)変数に代入 end attr_accessor :x, :y end class Sen def initialize(p1, p2) @p1 = p1 @p2 = p2 @a = (p2.y - p1.y)/(p2.x - p1.x) @b = -@a * p1.x p1.y end attr_accessor :p1 # 始点 attr_accessor :p2 # 終点 attr_accessor :a # 傾き attr_accessor :b # Y軸との交点 end def koten(l1, l2) x = (l1.b - l2.b)/(l2.a - l1.a) y = (l1.a * l2.b - l1.b * l2.a)/(l1.a - l2.a) puts x, y end p1 = Ten.new(0.0, 0.0) p2 = Ten.new(6.0, 4.0) p3 = Ten.new(0.0, 4.0) p4 = Ten.new(6.0, 0.0) l1 = Sen.new(p1, p2) l2 = Sen.new(p3, p4) koten(l1, l2)

  • Rubyのプログラムについて

    Rubyのプログラムについて、宜しければ教えてください。 def fct(n, f=1) if n<=1 then f else fct(n-1, n*f) end end def factorial(n) (1..n).inject{|x,y| x*y} end def factorial(n) eval( [*(1..n)].join("*") ) end このプログラムが、階乗を計算するメソッドになっているみたいなのですが、なぜコレだけで階乗が計算できるのでしょうか? 宜しければ教えてください><

    • ベストアンサー
    • Ruby
  • 二項演算子の定義

    二項演算子の定義 rubyを学び始めた超初心者です。プログラム経験はありません。 参考プログラム、下記を入力しましたが2箇所?納得ができません 笑われるような質問なのかどこを探しても解決できません。 よろしくご教授願います。 12行,16行 Vec.new(@x + other.x, @y + other.y) other., other.yの表記の意味が理解できません。 class定義が終了していないのに使用している 1 class Vec 2 attr_reader :x, :y 3 def initialize(x=0, y=0) 4 @x, @y = x, y 5 end 6 7 def inspect #表示用 8 "(#{@x}, #{@y})" 9 end 10 11 def +(other) 12 Vec.new(@x + other.x, @y + other.y) # x, y のそれぞれを足す 13 end 14 15 def -(other) 16 Vec.new(@x - other.x, @y - other.y) # x, y のそれぞれを引く 17 end 18 end 19 20 vec0 = Vec.new(3, 6) 21 vec1 = Vec.new(1, 8) 22 23 p vec0 24 p vec1 25 p vec0 + vec1

    • ベストアンサー
    • Ruby