0

私はRuby(Ruby 1.9.3、IRB 0.9.6(09/06/30))をいじり回しており、複素数クラスを開発しようとしています。initializeto_sメソッドは正常に機能しています。現在、4つの算術演算子をオーバーロードしようとしています。

私が持っていたのは次のとおりです。

def +(other)
    return ComplexNumber.new(@real + other.@real, @imag + other.@imag)
end

しかし、何らかの理由でそれは好きではありませんでしたother.@real; それは言う

構文エラー:予期しないtIVAR

。の後のコンマを指しますother.@real

それで私はそれを次のように変更しました:

def get_values
    return [@real, @imag]
end

def +(other)
    other_values = other.get_values
    return ComplexNumber.new(@real + other_values[0], @imag + other_values[1])
end

これは機能しますが、正しい方法ではないと感じています。get_valuesメソッドを公開したくありません。同じクラスの別のインスタンスの変数にアクセスする方法はありませんか?

4

2 に答える 2

3

(私の意見では)最良の方法は、変数への読み取り専用アクセスを提供し、realimag使用することattr_readerです。好き:

class ComplexNumber
  attr_reader :imag, :real
  ...
  def +(other)
    return ComplexNumber.new(@real + other.real, @imag + other.imag)
  end
end

attr_readerがユーザーに代わってメソッドを定義し.real().imag()[attr_accessorさらに定義.real=()して.image=()]

于 2012-05-27T19:46:00.233 に答える
1

インスタンス変数は@、別のインスタンスを参照するときになしでアクセスされます。

other.real

(それらを定義するために使用している、または独自のアクセサーを提供していると仮定しますattr_accessor。同じインスタンス内であっても、単にインスタンス変数を返す以外のロジックがある場合は、アクセサーを使用することをお勧めします。)

于 2012-05-27T19:39:38.477 に答える