Сортировка по рубинам - почему ошибка 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.