Rspec `eq` vs` eql` в тестах `expect`

В чем разница между использованием eq и eql в тестах rspec? Есть ли разница между:

it "adds the correct information to entries" do
  # book = AddressBook.new # => Replaced by line 4
  book.add_entry('Ada Lovelace', '010.012.1815', '[email protected]')
  new_entry = book.entries[0]

  expect(new_entry.name).to eq('Ada Lovelace')
  expect(new_entry.phone_number).to eq('010.012.1815')
  expect(new_entry.email).to eq('[email protected]')
end

и

it "adds the correct information to entries" do
  # book = AddressBook.new # => Replaced by line 4
  book.add_entry('Ada Lovelace', '010.012.1815', '[email protected]')
  new_entry = book.entries[0]

  expect(new_entry.name).to eql('Ada Lovelace')
  expect(new_entry.phone_number).to eql('010.012.1815')
  expect(new_entry.email).to eql('[email protected]')
end

Ответы

Ответ 1

Здесь существуют тонкие различия, основанные на типе равенства, используемого при сравнении.

Из документов Rpsec:

Ruby exposes several different methods for handling equality:

a.equal?(b) # object identity - a and b refer to the same object
a.eql?(b) # object equivalence - a and b have the same value
a == b # object equivalence - a and b have the same value with type conversions]

eq использует оператор == для сравнения, а eql игнорирует преобразования типов.

Ответ 2

Различия незначительны. eq - это то же самое, что и реализация рубина из ==. С другой стороны, eql совпадает с реализацией ruby из eql?.

eq проверяет эквивалентность объекта и приводит приведение типа к типу для преобразования различных объектов в один и тот же тип. Два объекта эквивалентны, если они принадлежат к одному и тому же классу и имеют одинаковое значение, но по сути они не являются одним и тем же объектом.

expect(:my_symbol).to eq(:my_symbol)
# passes, both are identical.
expect('my string').to eq('my string')
# passes, objects are equivalent 
expect(5).to eq(5.0)
# passes, Objects are not equivalent but was type casted to same object type. 

eql проверяет эквивалентность объектов и не пробует приведение типов.

expect(:my_symbol).to eql(:my_symbol)
# passes, both are identical.
expect('my string').to eql('my string')
# passes, objects are equivalent but not identical 
expect(5).to eql(5.0)
# fails, Objects are not equivalence, did not tried to type cast

equal проверяет идентичность объекта. Два объекта идентичны, если они являются одним и тем же объектом, то есть имеют одинаковый идентификатор объекта (общий адрес в памяти).

expect(:my_symbol).to equal(:my_symbol)
# passes, both are identical.
expect('my string').to equal('my string')
# fails, objects are equivalent but not identical
expect(5).to equal(5.0)
# fails, Objects are not equivalence and not identical