Различный obj_id, но равные значения в ruby? - PullRequest
0 голосов
/ 01 ноября 2018

Я довольно плохо знаком с рубином и практикую его. Однако в этом упражнении я создаю два банковских счета, используя один и тот же метод и одинаковые значения, и программа ожидает, что оба будут равны. 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

конец конец

Я пытался определить другой метод для ==, но мне это не удалось.

1 Ответ

0 голосов
/ 01 ноября 2018

Если вы хотите сравнить только атрибуты, а не сам объект, вот пример кода, с которого вы могли бы начать.

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 
...