多行字符串中的闭包

时间:2014-09-04 17:38:49

标签: groovy

我不确定它是否可行,但我希望在多行字符串中添加一个循环,在每个循环中生成另一个多行字符串。

 String body = """\
    Total Invoice Amount: £${totalInvAmt}

    ${quantities.each { qty ->
        Offer offer = Offer.findByShoppingItem(qty.shoppingItem)
        def itemDetails = """\
            Name: ${offer.itemName}
            Qty: $qty.value"""

        itemDetails
    }}
    """

闭包将循环遍历项目列表,并为每个项目连接多字符串。所有这些产生的是

Total Invoice Amount: £1100

    [100, 100]

提前感谢您提供任何帮助

2 个答案:

答案 0 :(得分:1)

这是伪代码,可以更接近你想要的东西,delta我不打算在没有SSCCE的情况下重现你的数据结构等。

Nutshell:each迭代,您想要collect

body = """
    Total Invoice Amount: £${totalInvAmt}

    ${quantities.collect { qty ->
        offer = Offer.findByShoppingItem(qty.shoppingItem)
        """
            Name: ${offer.itemName}
            Qty: ${qty.value}
        """
    }.join('\n')}
"""

我敦促你永远不要做这样的事情;这是辱骂。内部字符串生成至少应该以自己的方法处理,而不是楔入另一个字符串的中间。这很难阅读和维护。

答案 1 :(得分:0)

您可以使用模板引擎。

import groovy.text.GStringTemplateEngine

def music = [:]
music.Riverside = ['Second Life Syndrome', 'Anno Domini High Definition']
music.Beardfish = ['Destined Solitare', 'Mammoth']

def templateText = '''
Number Of Artists: ${music.size()}.

<% music.each { artist, albums -> %>\
Artist Name: ${artist}
    <% albums.each { albumTitle -> %>\
    Album Title: ${albumTitle}
    <% } %>
<% } %>
'''

def engine = new GStringTemplateEngine()
def template = engine.createTemplate(templateText).make(music:music)

println template.toString()

这将产生如下输出:

Number Of Artists: 2.

Artist Name: Riverside  
    Album Title: Second Life Syndrome    
    Album Title: Anno Domini High Definition    

Artist Name: Beardfish    
    Album Title: Destined Solitare    
    Album Title: Mammoth    

您有多种选择,并且在如何将它们组合在一起时具有很大的灵活性。有关详细信息,请参阅http://beta.groovy-lang.org/templating.html

我希望有所帮助。