Как позволить коду в функции «знать», что они запускаются в контексте ответа в groovy? - PullRequest
3 голосов
/ 29 марта 2012

Я называю какое-то облако, которое позволяет выполнять шпунтовые скрипты.Я возвращаю данные в виде XML из этого сценария.Я использую такой код:

def writer;
def xml;
writer = new StringWriter();
xml = new MarkupBuilder(writer);

xml.Response() {
   node('arrtibute1': value4arrtibute1);
}

Но мне нужно использовать более сложный способ вычисления значений.Я хочу поместить в это множество различных узлов.

def writer;
def xml;
writer = new StringWriter();
xml = new MarkupBuilder(writer);

xml.Response() {
   Function1();
   Function2();
}

... и реализации этих функций.

public void Function1(){
   node1('arrtibute1': value4arrtibute1);
}
public void Function2(){
   someOtherNode1('arrtibute1': otherValue4arrtibute1, ...);
}

Последний код не работает.Причина, по которой это не работает, заключается в том, что функции не знают, что они работают в контексте ответа и ищут методы node1 и someOtherNode1.

Когда я пытаюсь передать xml в функции и пытаюсьсоздать новый ответ там Я деформировал структуру XML-документа (документ в документе).

Мой вопрос: как позволить коду в функции "знать", что они выполняются в контексте ответа?

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

Вам нужно передать конструктор в функции, которые вы вызываете, так:

import groovy.xml.MarkupBuilder

value4arrtibute1 = 'val1'
otherValue4arrtibute1 = 'val2'

public void function1( MarkupBuilder builder ){
   builder.node1('arrtibute1': value4arrtibute1 )
}

public void function2( MarkupBuilder builder ){
   builder.someOtherNode1('arrtibute1': otherValue4arrtibute1 )
}

String output = new StringWriter().with { writer ->
  new MarkupBuilder(writer).with { xml ->
    xml.Response() {
      function1( xml )
      function2( xml )
    }
  }
  writer
}

println output
1 голос
/ 29 марта 2012

@ tim_yates верен в своем ответе, хотя я хотел бы рассказать о другом методе выполнения такого же рода вещей без необходимости обмениваться конструктором или делегатом.

На практике я обычно делаю обаfunction1 и function2 Закрывает и устанавливает своих делегатов в построитель.

import groovy.xml.MarkupBuilder

value4arrtibute1 = 'val1'
otherValue4arrtibute1 = 'val2'

Closure function1 = {
   node1('arrtibute1': value4arrtibute1 )
}

Closure function2 = {
   someOtherNode1('arrtibute1': otherValue4arrtibute1 )
}

String output = new StringWriter().with { writer ->
  new MarkupBuilder(writer).with { xml ->
    xml.Response() {
      firstNode()
      xml.with function1
      xml.with function2
    }
  }
  writer
}

println output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...