views:

213

answers:

4
def array = [1,2,3,4,5]
println 3 in array

prints true. What do I need to overload to support in for any object?

Example:

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

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

I know I could make the collection this class uses public, but I'd like to use in instead.

+1  A: 

I wonder if this is possible, the Membership Operator (in) isn't listed on the Operator Overloading page.

Pascal Thivent
I noticed that too.
Geo
A: 

Have you tried creating an "in" method?

ammoQ
`in` is a language keyword. I get a compilation error.
Geo
+2  A: 

You could make Whatever implement Collection or a Collection subinterface. Groovy has an iterator() implementation for Object, and it looks like for operators that work on aggregate objects, Groovy will attempt to convert the Object to a Collection and then perform the aggregate function.

Alternatively, you might be able to have Whatever implement Iterable. I'm still trying to find a reference for this and write a proof of concept to verify it.

The Groovy documentation for the Iterator Pattern might indicate that this will work.

Rob Hruska
+3  A: 

I asked on the Groovy mailing list. Here's the thread. The answer is isCase

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

a = new A()
println 6 in a // returns false
Geo
Sweet. After a quick search, looks like that's documented here: http://docs.codehaus.org/display/GROOVY/JN2535-Control#JN2535-Control-ConditionalStatements
Rob Hruska
+1. I wish I could vote Guillaume Laforge for this +1, after all, he was the one to answer it on the mailing list ;-)
Leonel