-1

结果:

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

我现在有一个非常简单的排序,一旦我完成了这个工作,意图将变得更加复杂(因此比较方法中的细节)。

4

3 回答 3

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]
于 2013-10-07T15:49:27.007 回答
0

MySorter将值数组转换为值数组的答案的替代方法是通过将以下内容作为块中的第一条语句Fixnum来扩展<=>方法处理比较的能力:Fixnum

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

可能有更优雅/更有效的机制来实现这一点,但你明白了。

于 2013-10-07T15:56:54.733 回答
-1

您的问题出现是因为您没有在 MySorter 中覆盖 ==。

您有一个 MySorter 对象数组,然后您尝试将其与 fixnums 数组进行比较,而您要比较的是 MySorter 对象的内容。

定义

  def == (other)
    other == value
  end

在 MySorter 中,您的问题就解决了。我认为默认的 ruby​​ == 运算符比较对象 id 或类似的,这显然会在您的 vanilla 案例中失败,因为 MySorter 不是 Fixnum。

于 2013-10-07T15:18:42.580 回答