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