groovy - 在 Groovy 中将方法作为参数传递

标签 groovy functional-programming closures

有没有办法在 Groovy 中将方法作为参数传递而不将其包装在闭包中?它似乎适用于函数,但不适用于方法。例如,给定以下内容:

def foo(Closure c) {
    c(arg1: "baz", arg2:"qux")
}

def bar(Map args) {
    println('arg1: ' + args['arg1'])
    println('arg2: ' + args['arg2'])
}

这有效:

foo(bar)

但是如果 bar 是类中的方法:

class Quux { 
    def foo(Closure c) {
        c(arg1: "baz", arg2:"qux")
    }

    def bar(Map args) {
        println('arg1: ' + args['arg1'])
        println('arg2: ' + args['arg2'])
    }

    def quuux() { 
      foo(bar)
    }
} 

new Quux().quuux()

失败并显示No such property: bar for class: Quux

如果我更改将 bar 包装在闭包中的方法,它可以工作,但似乎不必要地冗长:

    def quuux() { 
      foo({ args -> bar(args) })
    }

有更干净的方法吗?

最佳答案

.& 运算符来救援!

class Quux { 
    def foo(Closure c) {
        c(arg1: "baz", arg2:"qux")
    }

    def bar(Map args) {
        println('arg1: ' + args['arg1'])
        println('arg2: ' + args['arg2'])
    }

    def quuux() { 
      foo(this.&bar)
    }
} 

new Quux().quuux()
// arg1: baz
// arg2: qux

一般来说,obj.&method将返回一个绑定(bind)方法,即在obj上调用method的闭包。

关于groovy - 在 Groovy 中将方法作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15231810/

相关文章:

groovy - 使用collectEntries在groovy中比较两个 map 的差异

java - 如何使用 java 8 在超时的情况下调用另一个函数内的通用函数?

struct - 在 Rust 中调用存储在结构中的堆栈分配闭包

javascript - 带有对象/原型(prototype)的链式 Promise(Q 延迟)

JSON 到 Groovy 与 JsonSlurper 和未知 "string"

java - 从 Java 中的未知 Groovy 类访问字段

functional-programming - 如何在 OCaml 中将字典实现为函数?

swift - 使用闭包语法在 swift 中声明函数

debugging - IntelliJ 在 Debug模式下不显示值

performance - 在 OCaml 模式匹配中哪个更好, `when` 或 `if-then-else` ?