2013-10-07 2 views
-1

Результат:Ruby sort - why rspec error when "expected: [7, 6, 5, 5, 4, 3, 3]" кажется таким же, как "got: [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 

У меня есть очень простой вид в настоящее время, цель будет более сложным один раз я это (следовательно, деталь в методе сравнения).

ответ

1

Вы сравниваете массив объектов 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] 
-1

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

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

Определение

def == (other) 
    other == value 
    end 

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

0

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

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

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

Смежные вопросы