【发布时间】:2018-10-31 23:26:23
【问题描述】:
我对 ruby 还很陌生,并且正在练习它。 然而,在这个练习中,我正在使用相同的方法和相同的值创建两个银行账户,并且程序希望两者相等。 RSpec 将此返回给我:
Failure/Error: expect(conta1).to eql conta2
expected: #<Conta:0x3161bc8 @numero="2303-2", @nome="Jose da Silva", @saldo=1000.1, @limite=500>
got: #<Conta:0x31615f8 @numero="2303-2", @nome="Jose da Silva", @saldo=1000.1, @limite=500>
(compared using eql?)
Diff:
@@ -1,4 +1,4 @@
-#<Conta:0x3161bc8
+#<Conta:0x31615f8
@limite=500,
@nome="Jose da Silva",
@numero="2303-2",
两个账号的内容一样,但是object_id有冲突,怎么解决?
代码如下:
it "Two accounts with the same data should be equal" do
conta1 = cria_conta
conta2 = cria_conta
expect(conta1).to eql conta2
end
def cria_conta(numero="2303-2", nome="Jose da Silva", saldo=1000.10, limite=500)
Conta.new(numero: numero, nome: nome, saldo: saldo, limite: limite)
end
还有:
class Conta
attr_accessor :numero, :nome, :saldo, :limite
def initialize(arr)
@numero = arr[:numero]
@nome = arr[:nome]
@saldo = arr[:saldo]
@limite = arr[:limite]
end
def sacar(valor)
possibilidade = false
@@valor = valor
if valor < @saldo
@saldo -= valor
possibilidade = true
elsif valor > @limite
@saldo -= valor
@@saldo = @saldo
possibilidade
end
end
def no_limite?()
if @@valor > @limite
return true
elsif @@valor < @limite
return false
end
end
def depositar(valor)
@saldo += valor
end
def ==(outra_conta)
self.conta == outra_conta
结束 结束
我尝试为 == 定义一个不同的方法,但没有成功。
【问题讨论】:
-
提示:不要使用强制的
return,只需使用表达式:@@valor > @limite作为函数体就足够了。 -
您可能需要定义
.eql?而不仅仅是==。您还需要确保两个“相同”值具有来自hash方法的等效结果,否则您的对象可能无法正确排序到哈希表中作为键。 -
感谢您的提示!我把方法名设置为 eql?似乎我更接近它但是它仍然返回 object_id 哈希方法的等效结果是什么意思?谢谢!
-
通过输入
raise或puts来检查它是否真的在运行您的自定义等效方法,以确保您走在正确的轨道上。
标签: ruby class methods logic self