Сортировка по рубинам - почему ошибка rspec, когда "ожидается: [7, 6, 5, 5, 4, 3, 3]", выглядит так же, как и "получил: [7, 6, 5, 5, 4, 3, 3]"?

Результат:

Failures:

  1) An usual sorter sorts downwards by default
     Failure/Error: [a,b,c,d,e,f,g].sort.should == [7,6,5,5,4,3,3]
       expected: [7, 6, 5, 5, 4, 3, 3]
            got: [7, 6, 5, 5, 4, 3, 3] (using ==)
     # ./downsort_spec.rb:13:in `block (2 levels) in <top (required)>'

Finished in 0.00077 seconds

Тестовое задание:

require_relative 'my_sorter.rb'

describe "A usual sorter" do
  it "sorts downwards by default" do
    my_array= [3,5,7,5,3,6,4,2,5,6]
    a=MySorter.new(3)
    b=MySorter.new(5)
    c=MySorter.new(7)
    d=MySorter.new(5)
    e=MySorter.new(3)
    f=MySorter.new(6)
    g=MySorter.new(4)
    [a,b,c,d,e,f,g].sort.should == [7,6,5,5,4,3,3]
  end 
end

Код:

class MySorter
  include Comparable
  attr_reader :value

  def initialize(value)
    @value = value
  end

  def <=> (other)
    if value > other.value then
      -1
    elsif value < other.value then
      1
    else
       0
    end
  end

  def inspect
    @value
  end

end

Пока у меня есть очень простая сортировка, намерение будет более сложным, как только у меня будет эта работа (отсюда и детали в методе сравнения).

3 ответа

Решение

Вы сравниваете массив объектов MySorter с массивом Fixnums. Вам нужно изменить это:

[a,b,c,d,e,f,g].sort.should == [7,6,5,5,4,3,3]

в

[a,b,c,d,e,f,g].sort.map(&:value).should == [7,6,5,5,4,3,3]

Альтернатива ответу, включающему преобразование массива MySorter значения в массив Fixnum ценности, чтобы расширить возможности вашего <=> метод для обработки Fixnum Сравнение путем включения следующего в качестве первого оператора в блоке:

other = MySorter.new(other) if other.class == 'Fixnum'

Могут быть более элегантные / эффективные механизмы для достижения этой цели, но вы поняли идею.

Ваша проблема возникает потому, что вы не переопределили == в MySorter.

У вас есть массив объектов MySorter, которые вы затем пытаетесь сравнить с массивом фиксированных чисел, тогда как вы хотите сравнить содержимое объектов MySorter.

определять

  def == (other)
    other == value
  end

в MySorter и ваша проблема решена. Я думаю, что оператор ruby ​​== по умолчанию сравнивает идентификаторы объектов или аналогичные, что, очевидно, не сработает в вашем случае, так как MySorter не является Fixnum.

Другие вопросы по тегам