つまり、クラスで自分の '=='メソッドを定義してから、セット交差演算子( '&')で使用できますか?あるいは、 '&'演算子をオーバーライドする方法はありますか? このようなことができますか?ルビの交点をオーバーライドする方法はありますか?
def &(another_object)
#Code for intersection
end
つまり、クラスで自分の '=='メソッドを定義してから、セット交差演算子( '&')で使用できますか?あるいは、 '&'演算子をオーバーライドする方法はありますか? このようなことができますか?ルビの交点をオーバーライドする方法はありますか?
def &(another_object)
#Code for intersection
end
まず、&
はオペレータではありません。これは、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
私はクラスで自分の '==' メソッドを定義することができ
はい、次のことができます。そして、(積集合演算子を作る
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#&
のものです。
はい、これらのメソッドを定義できますが、定義する方法は明確ではありません。 – sawa
[メソッド名](http://ruby-doc.org/core-2.4.2/doc/syntax/methods_rdoc.html#label-Method+Names)のドキュメントは、どの演算子をメソッドとして定義できるかを説明しています。 – Stefan