2017-10-26 8 views
0

つまり、クラスで自分の '=='メソッドを定義してから、セット交差演算子( '&')で使用できますか?あるいは、 '&'演算子をオーバーライドする方法はありますか? このようなことができますか?ルビの交点をオーバーライドする方法はありますか?

def &(another_object) 
    #Code for intersection  
end 
+0

はい、これらのメソッドを定義できますが、定義する方法は明確ではありません。 – sawa

+0

[メソッド名](http://ruby-doc.org/core-2.4.2/doc/syntax/methods_rdoc.html#label-Method+Names)のドキュメントは、どの演算子をメソッドとして定義できるかを説明しています。 – Stefan

答えて

2

まず、&オペレータではありません。これは、LHOのメソッド&を呼び出して、唯一の引数としてRHOを渡す構文的な砂糖です。

二次的には、私が試した/ irbをコピーして貼り付けて、それがうまく動作するかどうかをチェックするのは、ここに質問を投稿するよりも難しい/

class MyObject 
    def ==(other) 
    other.is_a?(MyObject) && self.&(other).empty? 
    end 

    def &(other) 
    [] 
    end 
end 

mo1, mo2 = 2.times.map { MyObject.new } 
mo1 == mo2 #⇒ true 
mo1 == 42 #⇒ false 
0

私はクラスで自分の '==' メソッドを定義することができ

はい、次のことができます。そして、(積集合演算子を作る

class Foo 
    def ==(other) 
    # bla 
    end 
end 

と'&'))それを使用しますか?

はい、次のことができます。

require 'set' 

module MySetEqualityExtension 
    def &(other) 
    reduce([]) {|acc, el| if acc.any? {|a| a == el } then acc else acc << el end } 
    end 
end 

module MySetEquality 
    refine Set do 
    prepend MySetEqualityExtension 
    end 
end 

また、 '&' 演算子自体を無効にする方法はありますか? このようなことができますか?

def &(another_object) 
    #Code for intersection  
end 

はい。 (:それはちょうど尋ねるのではなく、それを試して、あなたに少ない時間と労力を取られていたサイドノートとして。)

class Foo 
    def &(other) 
    # bla 
    end 
end 

をあなたは、あなたが求めるもののすべてを行うことができますが、正しい方法は、になります単にeql?hashを正しく実装してください。これはSet#&のものです。

関連する問題