【问题标题】:grails/groovy braces syntax questiongrails/groovy 大括号语法问题
【发布时间】:2011-08-02 05:06:28
【问题描述】:

我正在处理一个示例,我无法理解大括号的作用——下面第二个“out”语句中“Logout”周围的那些。我猜这个字符串是作为闭包传递的,但我没有得到除此之外的语法。你能澄清一下吗?请注意,代码的输出如下所示:

John Doe [注销]


class LoginTagLib {
  def loginControl = {
    if(request.getSession(false) && session.user){
      out << "Hello ${session.user.login} "
      out << """[${link(action:"logout",
             controller:"user"){"Logout"}}]"""
     } else {
       out << """[${link(action:"login",
       controller:"user"){"Login"}}]"""
     }
   }
}

非常感谢

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    link 标签带有属性和正文,作为常规 GSP 标签,它的名称如下:

    <g:link action="logout" controller="user">Logout</g:link>
    

    要将其作为您正在执行的方法调用,您需要一种方法来传递文本(“注销”)以在链接中呈现。如果您查看标签的来源(单击http://grails.org/doc/latest/ref/Tags/link.html 底部的“显示来源”),您会看到第二个参数是body,它是一个闭包(虽然从代码中并不清楚,但是2 参数标签总是如此)。 {"Logout"} 是一个返回“Logout”的闭包,因为它是最后一个表达式,所以它被用作主体。

    【讨论】:

    • 问题:那么 {"Logout"} 之前不应该有逗号吗,因为它是传递的第二个参数?即根据 Groovy 2 参数闭包示例: def printSum = { a, b -> print a+b } printSum( 5, 7 )
    • 不,当闭包是最后一个参数时,逗号是可选的
    • 实际上,逗号不是可选的...将闭包放在调用的括号内是可选的。如果闭包被传递到括号内的函数中,则必须使用逗号,即 func(a){clos} = func(a, {clos})
    【解决方案2】:

    其实输出应该是

    Hello John Doe [Logout]
    

    本质上,如果有会话并且用户写 Hello user 并创建一个链接,该链接指向带有标签 Logout 的注销操作。

    { "Logout" } 是一个等价于 { return "Logout"; 的闭包。 } 作为最后一条语句,如果没有明确声明,则用于返回值。

    【讨论】:

    • 感谢您对隐式返回的澄清/提醒。
    【解决方案3】:

    我无法得到如下输出

    Hello John Doe [Logout]
    

    这是我得到的输出

    你好 jdoe [Logout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多