Groovy 创建;除非;语句作为用户定义脚本的绑定

Groovy 创建;除非;语句作为用户定义脚本的绑定,groovy,scripting,groovyshell,Groovy,Scripting,Groovyshell,我有一个任务,其中我需要为用户脚本实现一个处理器,在脚本的一部分中,除非出现,否则它需要与if语句的行为相反。有没有一种方法可以创建一个绑定,它的行为就是这样的。 我不熟悉Groovy,所以我的解释可能不太清楚,但我的代码可以告诉我更多关于我的问题的信息。将除非替换为if语句效果很好,但我需要一个制作除非的方法 static List<String> filterSitesByUserScript(String userScript, List<String> sites

我有一个任务,其中我需要为用户脚本实现一个处理器,在脚本的一部分
中,除非出现
,否则它需要与
if语句的行为相反。有没有一种方法可以创建一个
绑定
,它的行为就是这样的。 我不熟悉
Groovy
,所以我的解释可能不太清楚,但我的代码可以告诉我更多关于我的问题的信息。将除非替换为
if语句
效果很好,但我需要一个制作
除非的方法

static List<String> filterSitesByUserScript(String userScript, List<String> sites) {

  //properties
  List<String> rememberedSites = new ArrayList<String>()

  //binding
  def binding = new Binding()
  binding['allSites'] = sites
  binding['rememberedSites'] = rememberedSites
  binding['download'] = {String site ->
      new URL(site).getText()
  }
  //binding['unless'] = {statement -> statement == !statement}
  binding['siteTalksAboutGroovy'] = { content -> content.contains("groovy") || content.contains("Groovy") }
  binding['remember'] = { String site -> rememberedSites.add(site)}

  //groovy shell
  GroovyShell shell = new GroovyShell(binding)
  shell.evaluate(userScript)

  return rememberedSites
}

//A test user script input.
String userInput = '''
   for(site in allSites) {
       def content = download site
       unless (siteTalksAboutGroovy(content)) {
           remember site
       }
   }
   return rememberedSites
'''

//Calling the filtering method on a list of sites.
sites = ["http://groovy.cz", "http://gpars.org", "http://groovy-lang.org/", "http://infoq.com", "http://oracle.com", "http://ibm.com"]
def result = filterSitesByUserScript(userInput, sites)
result.each {
    println 'No groovy mention at ' + it
}
assert result.size() > 0 && result.size() < sites.size
println 'ok'
static List filterstestesbyuserscript(字符串userScript,列表站点){
//性质
List rememberedSites=new ArrayList()
//装订
def binding=新绑定()
绑定['allSites']=站点
绑定['rememberedSites']=rememberedSites
绑定['download']={String site->
新URL(site.getText())
}
//绑定['除非']={statement->statement===!statement}
绑定['SiteTalksOutGroovy']={content->content.contains(“groovy”)| | content.contains(“groovy”)}
绑定['membere']={String site->rememberedSites.add(site)}
//槽壳
GroovyShell shell=新GroovyShell(绑定)
evaluate(userScript)
返回记忆站点
}
//测试用户脚本输入。
字符串userInput='''
用于(所有站点中的站点){
def content=下载站点
除非(SiteTalksOutGroovy(内容)){
记住站点
}
}
返回记忆站点
'''
//在站点列表上调用筛选方法。
地点=[”http://groovy.cz", "http://gpars.org", "http://groovy-lang.org/", "http://infoq.com", "http://oracle.com", "http://ibm.com"]
def result=filterSitesByUserScript(用户输入,站点)
结果,每个{
println'在'+it'上没有groovy提及
}
断言result.size()>0&&result.size()
如果要执行以下代码:

除非(SiteTalksOutGroovy(内容)){
记住站点
}
您可以创建一个绑定
,除非该绑定使用两个参数存储闭包:

binding['除非]={test,block->if(!test)block()}
仅当第一个参数
test
为false时,此闭包才会执行
block()。在您的示例中,使用
运行代码,除非
闭包将产生以下输出:

No groovy mention at http://infoq.com
No groovy mention at http://oracle.com
No groovy mention at http://ibm.com

如果要执行以下代码:

除非(SiteTalksOutGroovy(内容)){
记住站点
}
您可以创建一个绑定
,除非该绑定使用两个参数存储闭包:

binding['除非]={test,block->if(!test)block()}
仅当第一个参数
test
为false时,此闭包才会执行
block()。在您的示例中,使用
运行代码,除非
闭包将产生以下输出:

No groovy mention at http://infoq.com
No groovy mention at http://oracle.com
No groovy mention at http://ibm.com