-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 オブジェクトの配列を Fixnum の配列と比較しています。これを変更する必要があります:

[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 オブジェクトの配列があり、それを fixnum の配列と比較しようとしていますが、比較したいのは MySorter オブジェクトの内容です。

定義

  def == (other)
    other == value
  end

MySorter で、あなたの問題は解決されました。MySorter は Fixnum ではないため、デフォルトの ruby​​ == 演算子はオブジェクト ID などを比較すると思いますが、バニラの場合は明らかに失敗します。

于 2013-10-07T15:18:42.580 に答える