2013-03-29 5 views
2

Я реализую определения шага Groovy для Cucumber-JVM, и я хочу, чтобы был способ сохранить себя, чтобы следующий шаг мог повторить его n раз.Как может быть закрытие Groovy для повторения?

Given(~'the (\\S+) is in the blender') { String thing -> 
    // do stuff... 
    context.repeatable = self.curry(thing) 
} 

Что должно быть «я» в вышеуказанном коде?

Я не могу использовать «это», поскольку это относится к окружающему объекту (что бы ни было в этом случае, возможно, сценарию).

+0

Вам нужна ссылка на метод, в котором он находится? – Will

+0

Нет, ссылка на само закрытие, изнутри крышки. – quantoid

+0

Я считаю, что «это» раньше было ссылкой на себя, но «это» в какой-то момент было изменено, чтобы быть ссылкой на экземпляр класса, в котором определено замыкание. – quantoid

ответ

1

Поскольку curry является метод Closure класса, непосредственно вызывая Карри относится к закрытию, и если он назван:

def context 

test = { String thing -> 
    context = curry(thing) 
    thing.toUpperCase() 
} 

test('hello') 
println context.call() 
test('world') 
println context.call() 

=>

HELLO 
WORLD 

или анонимным:

def context 

['test'].each { String thing -> 
    context = curry(thing) 
    thing.toUpperCase() 
} 

println context.call() 

=>

TEST 
+0

Doh! Отлично, спасибо. – quantoid

0

Вы можете попробовать использовать неиспользуемые curry метод прохождения полученные параметры:

clos = { String text -> 
    if (text) { 
     println "text=$text" 
     a = curry null 
     a() 
    } else { 
     println "done" 
    } 
} 

clos "closure text" 

Напечатает:

text=closure text 
done 

Update

Вы можете также использовать clone():

closure = { 
    def clone = clone() 
}