2016-09-10 10 views
-1

ルビーを学んでいます。今日はミックスインについて学び、スタッククラスの比較メソッドを実装することに決めました。最初にスタックのサイズに基づいてスタックを比較していましたが、スタックサイズが等しい場合はスタック内の各要素を比較してどちらが大きかったかを判断する機能を追加したかったのです。そして、すべての要素が等しい場合、2つのスタックが等しくなるでしょう。ここに私のコードです:ルビーの要素に基づいてスタックを比較する

class Stack 
    include Enumerable 
    include Comparable 

attr: stack 

def initialize 
    @stack = [] 
end 

def pop(element) 
     @stack.push(element) 
end 


def push(element) 
     @stack.pop(element) 
end 

def <=>(other) 
     if stack.size == other.stack.size then 
     stack.zip(other.stack).all? { |s, other| s <=> other} 
     else 
     stack.size <=> other.stack.size 
     end 
end 
end 

しかし、これは、私は次のテストを持っているときのために失敗します。

s1 = Stack.new 
s2 = Stack.new 

s1.push(1) 
s1.push(2) 
s1.push(3) 

s2.push(1) 
s2.push(2) 
s2.push(4) 

s2 > s1 # Should be true but is false 
+0

あなたの 'Stack'クラスは本当にどのように見えますか?あなたが持っているものは、構文的には有効ではありません。また、 'Array#pop'を使用して' Array#push'と 'Stack#push'を実装した' Stack#pop'はなぜ実装されていますか?さらに、 '<=>'は 'Fixnum'(-1、0、+1)を返しますが、' any? 'はそのブロックがtrueかfalseを返すことを期待しています。 {| s、その他| s <=> other} 'あなたは効果的に' all? {真} '。私はいくつかのデバッグ技術を学ぶ時だと思う。 –

+0

's1'が' s2'より大きいいくつかの値を持ち、 's2'が' s1'よりも大きな値を持つケースをどう扱うといいでしょうか? – davidhu2000

+0

@muistooshortクラスのインデントと欠落のほかに、これがどのように構文的に有効でないかはわかりません。それは文字どおりのように見えます。私のマシンではエラーなく実行されます。また、私は独自の配列のスタックスタッククラスを作成していました。私はそれをどうやって問題になったのですか?私が最後の部分をする方法を知っていたら、私はここで質問しません。私は2つの配列の要素を比較し、より大きな要素を持つものを返す方法を知らない。ソリューションにアプローチする方法がわからないとデバッグできませんか?私は周りを見回しました。私がしようとしていることに役立つものは何も見つかりませんでした。 –

答えて

-1

は、ここで私はこの仕事をするためにやったことです。間違いなく良い方法がありますが、これは機能的です。

class Stack 
    include Enumerable 
    include Comparable 

    attr :stack 

    def initialize 
     @stack = [] 
    end 

    def pop(element) 
     @stack.pop(element) 
    end 

    def push(element) 
     @stack.push(element) 
    end 

    def <=>(other) 
     if stack.size == other.stack.size then 
     stack.zip(other.stack).each do |s, other| 
      return s <=> other unless other == s 
     end 
     return 0 
     else 
     stack.size <=> other.stack.size 
     end 
    end 

    def >(other) 
     (self <=> other) == 1 
    end 

    def <(other) 
     (self <=> other) == -1 
    end 

    def ==(other) 
     (self <=> other) == 0 
    end 
end 

は、だから私がやったこと<=>メソッドの戻り値のいずれか-10、または1を持っています。あなたの例に基づいて、s2のサイズがs1より大きい場合、関数は1を返します。 s2の値がs1より大きい場合は、1も返されます。

Iはまた<>を定義し、値が比較上に出力するかどうかtrue又はfalseを決定する<=>メソッドから返されたチェック==方法。

s1 = Stack.new 
s2 = Stack.new 

s1.push(1) 
s1.push(2) 
s1.push(3) 

s2.push(1) 
s2.push(2) 
s2.push(4) 

s2 > s1 #=> true 

これにより問題が解決され、上記の比較結果はtrueとなります。

+0

'>'、 '>'、 '=='を定義しないでください。 'Comparable'をインクルードすると、それらのもの(および他のもの)を無料で入手できます。ただし、 'Enumerableをインクルードする 'ときに' each'メソッドを定義します。 – steenslag

関連する問題