【问题标题】:Groovy: unwrapping named map arguments in methodGroovy:在方法中展开命名映射参数
【发布时间】:2015-04-12 20:05:39
【问题描述】:

我发现自己将很多变量作为命名参数传递给我的方法,因为它使事情变得更加清晰:

doFunction(name: 'Jack', age: 27)

现在在 doFunction 我经常发现自己这样做:

doFunction(Map args) {

  if (args['name']) {
    def name = args['name'] 
    // do stuff with name 
  }
} 

是否有语言功能可以即时将 Map 解包到其各自的参数?我找不到那样的东西。如果没有,我很好奇为什么,这似乎是自然的 Groovy 样板方法。 我想要一种方法来立即检查并处理参数(如果存在),有没有更清洁的方法来做到这一点?我是否完全以错误的方式接近 Map 参数?

【问题讨论】:

    标签: groovy


    【解决方案1】:

    因为没有像 e.g. 这样的解构。在 clojure 中,使用这样的地图的一种方法是使用 with。喜欢:

    void destruct(Map params) {
        params.with{
            if (name) {
                println "Hello $name"
            }
            if (age) {
                println "I am $age years old"
            }
        }
    }
    
    destruct name: "World", age: 4.54e9
    // => Hello World
    // => I am 4.54E+9 years old
    destruct name: "Computer"
    // => Hello Computer
    

    同样在挑剔方面:那些是 no 命名参数(例如在 python 中)。它只是传递地图的语法糖。例如。它是destruct([name: 'World']) 的缩写——它适用于方法void destruct(String name, BigDecimal age)

    【讨论】:

    • 有趣!感谢您的挑剔评论,您能告诉我使用 Clojure 的方法吗?
    • 在 clojure 中会类似于:let [{:keys [name age]} params]。让委托工作的一个简单示例是使用Expando 作为您的超类,它基本上是一个地图支持的存储类。
    猜你喜欢
    • 2012-10-26
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2013-10-07
    • 1970-01-01
    • 2011-04-16
    • 2014-07-31
    相关资源
    最近更新 更多