理解できない箇所を解説!二項演算子の定義について

このQ&Aのポイント
  • rubyを学び始めた超初心者が二項演算子の定義について質問しています。具体的には、参考プログラムで表記されている「other.x」と「other.y」の意味について理解できないと述べています。また、class定義が終了していないのに使用している点にも疑問を持っています。
  • 二項演算子の定義について理解できない箇所があります。参考プログラムで「other.x」と「other.y」という表記がありますが、これはベクトルの加算や減算を行うための演算子です。「other.x」は引数として与えられたベクトルのx座標、同様に「other.y」はy座標を表しています。
  • 学習中の超初心者が二項演算子の定義について質問しています。参考プログラムでの「other.x」と「other.y」は、引数として与えられたベクトルのx座標とy座標を表しています。これらの値を元のベクトルのx座標とy座標に加算する処理を行っています。また、class定義が終了していないのに使用している点に関しては、文法的なエラーではありませんが、書き方としては適切ではありません。
回答を見る
  • ベストアンサー

二項演算子の定義

二項演算子の定義 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
  • 回答数2
  • ありがとう数6

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

  • ベストアンサー
  • hisappy
  • ベストアンサー率46% (184/392)
回答No.1

はーい。Rubyを学び始めたいと思っている者です。 一応雑誌の記事を読んだ事ある程度の知識と 一応プログラマしてた知識をを総動員したフリして 解説っぽく回答します。 なので、回答内容が正しいかどうかもあわせての検証をお願いします。 各行の頭についている数字は行番号という認識で進めていきます。 では始まり始まり。 1:クラスVecの宣言。 2:Vec用変数xとyの宣言。 3:いきなり使われるとx、yの中身は不定なので初期化(?)。 4:…何だろう?初期化の実体? 5:初期化の終端。 6: 7:表示処理の…関数みたいなもの? 8:表示処理の実体? 9:表示の終端。 10: 11:足し算する時はこうよ。宣言 12:足し算処理はこうするのね。 13:足し算終端。 14: 15:引き算する時はこうよ。宣言 16:引き算処理はこうするのね。 17:引き算終端。 18:---クラスVecの終端? 19: 20:vec0として、xに3、yに6をセットします。 21:vec1として、xに1、yに8をセットします。 22: 23:vec0の内容を表示? (3,6) 24:vex1の内容を表示? (1,8) 25:vec0とvec1を足して表示? (4,14) こんな感じでしょうか。 では質問文に対しての回答。 @が付いているのは12行目の場合、"+"の左側にきたもののデータ。 25行目でいうvec0に格納(?)されているxが3でyは6。 に対して、other.xとother.yは"+"の右側にきたもののデータのxとy。 25行目でのvec1の部分に相当。 つまり、25行目では「vex0とvex1のx同士、y同士を足しますよ」 と言っているものと思われます。 頭にpが付いているので表示処理も合わせて行うと推測しました。 さて、現実はいかに?

a_yamada
質問者

お礼

詳細な説明ありがとうございます。 非常によく理解できました。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> 12行,16行 Vec.new(@x + other.x, @y + other.y) > other., other.yの表記の意味が理解できません。 > class定義が終了していないのに使用している そもそも、Rubyの場合、ここでのotherがclass Vecであるとは限りません。 x,yというメソッドなり属性なりを持っていて、それぞれが@x,@yと演算できるオブジェクトを返すのだったら、なんでもいいはずです。 C++やJava等のような、宣言が必要な言語と混同していませんか? もっとも、そういった言語でも「クラスの定義が終了していない」状態でも、宣言さえあれば使用できますが。 // C++の例: class Vec{ //定義開始 public: double x; double y; // 「定義」の途中だけどVecクラスを使っている Vec& operator+=(const Vec& other){ this->x += other.x ; this->y += other.y ; return *this ; } }; // Vecの定義終了

a_yamada
質問者

お礼

回答ありがとうございます。 やはり60過ぎてプログラムの勉強は難しいですね。 >C++やJava等のような、宣言が必要な言語と混同していませんか? 他のプログラム言語はよく知りません。

関連するQ&A

  • 演算子の再定義とインスタンス変数の参照と代入

    list9.1とlist 9.3をあわせた二次元の座標、xとyを持つ プログラムです class Point attr_reader :x, :y def initialize(x=0, y=0) @x, @y = x, y end def inspect # 表示用 "(#{x}, #{y})" end def +(other) # x、yのそれぞれを足す self.class.new(x + other.x, y + other.y) end def -(other) # x、yのそれぞれを引く self.class.new(x - other.x, y - other.y) end def [](index) case index when 0 x when 1 y else raise ArgumentError, "out of range `#{index}'" end end def []=(index, val) case index when 0 self.x = val when 1 self.y = val else raise ArgumentError, "out of range `#{index}'" end end end point = Point.new(3, 6) p point[0] #=> 3 p point[1] = 2 #=> 2 p point[1] #=> 2 p point[2] #=>エラー(ArgumentError) についてお尋ねしたいのですが、 def [](index)で演算子を再定義する際、値を参照する方法で def [](index)  case index  when 0   x   : と、していますが、xp.135のアクセサの説明など では@xと「@」が要りそうな感じがするのですが、この 場合は省いて大丈夫なんでしょうか? プログラムがローカル変数と間違って処理したりという ことは無いんでしょうか。 仮にないとすれば、ここのcase文にはインスタンス変数 と同じ名前のローカル変数などは定義できないのでしょうか? ご教授願います。

    • ベストアンサー
    • 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 の 文法に困ってます。

    以下のようなソースの場合、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の資格試験の勉強をしています。 分からない部分がありまして質問させていただきます。 class Employee attr_reader :id attr_accessor :name def initialize id , name @id = id @name = name end def to_s return "#{@id}:#{@name}" end def <=> other return self.id <=> other.id end employees = [ ] employees <<Employee.new("3","Tanaka") employees<<Employee.new("1","Suzuki") employees<<Employee.new("2","Sato") employee.sort! (質問) 「return self.id <=> other.id」この部分のselfとotherが何をさしているのか分かりません。3つめでインスタント化している「employees<<Employee.new("2","Sato")」のは、selfに入りそれまでに入れた値はotherに入っているのでしょうか? ご回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • メソッドが定義されるタイミングについて

    メソッドが定義されるタイミングについて ケース1 # 1 p cal(3) def cal(num) 1 + num end #2 p cal(3) ケース2 class test def cal(num) 1 + num end #3 p cal(3) end test = Test.new ケース1、2を通して、#2以外はcal()のメソッドが定義されていません。とい うエラーがでます。 なぜ#2のpだけは実行されて他のものは実行されないでしょうか。

    • ベストアンサー
    • Ruby
  • rubyでScalaのようにコールバックを変数として定義するには?

    rubyでScalaのようにコールバックを変数として定義するには? 最近Scalaの勉強を始めました。自分の一番好きな言語はrubyなので、比較しながら勉強してます。 参考書によると、関数をオブジェクトとして扱えるのがScalaの特徴との説明がありました。例えば、以下のような例なのですが、(行頭スペースは全角) class Kuku(a:Int,b:Int){  def calc(func:(Int,Int)=>String):String={   return func(a,b)+a*b  } } val f1=(a:Int,b:Int)=>a+"*"+b+"=" println(new Kuku(3,5).calc(f1)) これをrubyで書くと、(行頭スペースは全角) class Kuku  def initialize(x,y)   @x=x   @y=y  end  def calc   yield(@x,@y)+(@x*@y).to_s  end end puts Kuku.new(3,5).calc{|a,b| a.to_s+'*'+b.to_s+'='} とまでは書けたのですが、コールバック(ブロックパラメータの部分)、上記例だと |a,b| a.to_s+'*'+b.to_s+'=' の部分 を変数として定義(Scalaの例のf1として定義するところ)する方法を知りません。 このように関数を変数として定義する事ってrubyではできないと考えるのですが、そういった認識で間違いないでしょうか? ご指導の程、よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 【ruby】 『クラスの生成に失敗』を表現したい

    『クラスの生成に失敗』を表現したいのです。 newの戻り値にnilやfalseを返せばよいと考え、 以下の様に書いてみました。(行頭は全角スペースです。) class Hoge  def initialize(arg)   return arg  end end h = Hoge.new(false) STDERR.puts 'err' unless(h) errはputsされませんでした。(グーグルで調べるとinitializeのreturnは、返ってこないそうでした。) そこで以下の様に書きました。(行頭は全角スペースです。) class Hoge  attr_reader :stat  def initialize(arg)   @stat = arg  end end h = Hoge.new(false) STDERR.puts 'err' unless(h.stat) なんか、ものすごく我流になってる気がします。。。 アドバイスをお願いいたします。

    • ベストアンサー
    • Ruby
  • 【javascript】『-』や『+』を再定義したい。

    引数にエレメントを指定するとエレメントの座標を返すfancitonを作りました。(行頭は全角スペースです。) function getLocation(element){  var x=0,y=0,p=element;  while(p){   x+=p.offsetLeft - p.scrollLeft;   y+=p.offsetTop - p.scrollTop;   p=p.offsetParent;  }  return {x: x,y: y}; }; たとえば、これを以下の様にして使うのですが、 locA=getLocation(getElementById("AAA")); locB=getLocation(getElementById("BBB")); locAとlocBの差分を求めたいとき、 def={x: (locA.x - locB.x),y: (locA.y - locB.y)} といちいち書かなくてはならず面倒です。 fanciton def(a,b){ return {x: (a.x-b.y),y: (a.y-b.y)}; }; のようなfancitonを作れば少しは楽になるでしょうけど、 def = locA - locB; と書けるようになると、イイなぁと思います。 {x: x,y: y}と定義したオブジェクトに対する『-』や『+』を再定義する事はjavascriptでは、できないものでしょうか?

  • Rubyのクラス

    class Test def initialize @ary = Array.new(size){false} end def print _print end def _print print"#{@ary}" end end test = Test.new(5) test.print 上記のプログラムはエラーが出て実行できません。期待している動作は[false,false,false,false,false]です。どうしてエラーが出るか教えていただきたいです。また、解決策もよろしくお願いします。

    • ベストアンサー
    • 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

専門家に質問してみよう