Создайте оператор «исключение» в качестве привязки из пользовательского сценария - PullRequest
0 голосов
/ 07 октября 2018

У меня есть задача, в которой мне нужно реализовать процессор для пользовательского скрипта, где в одной части скрипта появляется unless, и он должен вести себя как противоположность if statement.Есть ли способ создать binding, который будет вести себя так.Я новичок в Groovy, поэтому, возможно, мое объяснение не так ясно, но мой код может рассказать немного больше о моей проблеме.Замена, если только if statement не работает идеально, но мне нужна идея для создания unless.

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'

1 Ответ

0 голосов
/ 07 октября 2018

Если вы хотите выполнить следующий код:

unless (siteTalksAboutGroovy(content)) {
    remember site
}

, вы можете создать привязку unless, которая хранит замыкание с двумя параметрами:

binding['unless'] = { test, block -> if (!test) block() }

Это замыкание выполняется block() только если первый параметр test равен false.В случае вашего примера выполнения кода с unless замыкание выдаст следующий вывод:

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