質問: Point.new(1,8) p point0 #=>(3,6) p point1 #=>(1,8) p point0 + point1 #=>(4,14) p point0 - point1 #=>(2,-2) ================↑例題=======================
回答: ・otherはオブジェクトか? オブジェクトです。この場合はPointクラスの他のオブジェクトであることを期待しています。 ・otherがオブジェクトでなければ何なのか? 上で述べたとおりです。 ・xはメソッドか? メソッドです。 ・xがメソッドでなければ何なのか? 上で述べたとおりです。 ・何か特別なルールがある場合はそのルールの詳細(参考サイトでも全然大丈夫です。) 今回のソースのミソは ``` attr_reader :x, :y ``` と言う部分です。この部分は実質 ``` def x return @x end def y return @y end ``` と書いた場合と同じになります。`attr_reader`は上記のメソッド定義を自動的にしてくれる便利なクラス(及びモジュール)用のメソッドです。他の仲間に`attr_writer`と`attr_accessor`がいます。 こういう仕組みのため、他のPointのオブジェクト`other`に対して、other.xでotherの中の@x、other.yでotherの中の@yに取得できるというわけです。あとは自分の@xと@yと+や-した結果で新たなPointオブジェクトを作るというのが今回のソースの意味になります。