0

我一直在搞乱Ruby(Ruby 1.9.3,IRB 0.9.6(09/06/30)),我正在尝试开发一个复数类。我的initializeandto_s方法工作正常。我现在正试图重载四个算术运算符。

我所拥有的是以下内容:

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 回答