我一直在搞乱Ruby(Ruby 1.9.3,IRB 0.9.6(09/06/30)),我正在尝试开发一个复杂的数字类。我有initialize
和to_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
方法;我有没有办法访问同一个类的另一个实例的变量?
答案 0 :(得分:3)
最好的方式(在我看来)是使用real
提供对变量imag
和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=()
]
答案 1 :(得分:1)
当引用另一个实例时,在没有@
的情况下访问实例变量:
other.real
(假设您要么使用attr_accessor
来定义它们,要么提供自己的访问器。即使在同一个实例中,您也可能更喜欢使用访问器,以防除了返回实例变量之外的逻辑。)