【问题标题】:Different obj_id but equal values in ruby?ruby中不同的obj_id但相同的值?
【发布时间】: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 &gt; @limite 作为函数体就足够了。
  • 您可能需要定义.eql? 而不仅仅是==。您还需要确保两个“相同”值具有来自 hash 方法的等效结果,否则您的对象可能无法正确排序到哈希表中作为键。
  • 感谢您的提示!我把方法名设置为 eql?似乎我更接近它但是它仍然返回 object_id 哈希方法的等效结果是什么意思?谢谢!
  • 通过输入 raiseputs 来检查它是否真的在运行您的自定义等效方法,以确保您走在正确的轨道上。

标签: ruby class methods logic self


【解决方案1】:

如果您只想比较属性,而不是对象本身,这里是您可以开始使用的示例代码。

class Person
  attr_accessor :name, :id
  def initialize(id, name)
    @id = id
    @name = name
  end

  def ==(other_person)
    self.instance_variables.each do |method|
      method = method.to_s.gsub('@', '')
      return false if self.send(method) != other_person.send(method)
    end
    return true
  end
end

p1 = Person.new(1, 'alice')
p2 = Person.new(1, 'alice')
p3 = Person.new(1, 'tim')
puts p1 == p2 # true
puts p1 == p3 # false 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多