2009-10-17 15 views
7
def array = [1,2,3,4,5] 
println 3 in array 

プリントtrueです。どんなオブジェクトでもinをサポートするために何をオーバーロードする必要がありますか?Groovyでin演算子をどのようにオーバーロードしますか?

例:

class Whatever { 
    def addItem(item) { 
     // add the item 
    } 
} 

def w = new Whatever() 
w.addItem("one") 
w.addItem("two") 
println "two" in w 

は、私は、このクラスがパブリック使用するコレクションを作ることができる知っているが、私の代わりにinを使用したいと思います。

+0

あなたは何をしたいのですか? –

答えて

8

私はGroovyのメーリングリストで尋ねました。 Here'sスレッド。答えはisCase

class A 
{ 
    def isCase(o) { 
    return false; 
    } 
} 

a = new A() 
println 6 in a // returns false 
+0

甘い。クイック検索の後、http://docs.codehaus.org/display/GROOVY/JN2535-Control#JN2535-Control-ConditionalStatements –

+0

+1に記載されているように見えます。結局のところGuillaume Laforgeに+1してもらえたらいいと思うが、彼はメーリングリストでそれに答える人だった。 – Leonel

1

メンバーシップオペレーター(in)がOperator Overloadingページに記載されていないのでしょうか。

+0

私もそれに気づいた。 – Geo

2

WhateverCollectionまたはCollectionサブインターフェイスを実装させることができます。 GroovyはObjectのためにiterator()implementationを持っており、集約オブジェクトで動作する演算子のように見えますが、GroovyはObjectをCollectionに変換してから集約関数を実行しようとします。

WhateverIterableを実装することができます。私はまだこれについてのリファレンスを見つけようとしており、それを検証するための概念証明を書いています。

Groovy documentation for the Iterator Patternは、これが機能することを示している可能性があります。

関連する問題