Ruby访问其他对象的实例变量

时间:2012-05-27 19:36:45

标签: ruby

我一直在搞乱Ruby(Ruby 1.9.3,IRB 0.9.6(09/06/30)),我正在尝试开发一个复杂的数字类。我有initializeto_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方法;我有没有办法访问同一个类的另一个实例的变量?

2 个答案:

答案 0 :(得分:3)

最好的方式(在我看来)是使用real提供对变量imagattr_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=()]

答案 1 :(得分:1)

当引用另一个实例时,在没有@的情况下访问实例变量:

other.real

(假设您要么使用attr_accessor来定义它们,要么提供自己的访问器。即使在同一个实例中,您也可能更喜欢使用访问器,以防除了返回实例变量之外的逻辑。)