Groovy:完美的转发

Groovy:完美的转发,groovy,perfect-forwarding,Groovy,Perfect Forwarding,我想做一个闭包,比如说print_args,它接受另一个闭包,比如说f,它打印它的参数,然后将参数传递给f 我的第一次尝试如下: def print_args(f) { { Object... args -> args.each { println it }; f(*args) } } println print_args_sum(x) 因此,如果我们还定义: def add = { x, y -> x + y } 我们可以这样做: println add(1,2) def

我想做一个闭包,比如说
print_args
,它接受另一个闭包,比如说
f
,它打印它的参数,然后将参数传递给
f

我的第一次尝试如下:

def print_args(f) { { Object... args -> args.each { println it }; f(*args) } }
println print_args_sum(x)
因此,如果我们还定义:

def add = { x, y -> x + y }
我们可以这样做:

println add(1,2)

def print_args_add = print_args(add)

println print_args_add(1,2)
可以看出,
print\u args\u add
只是一个闭包,它不添加,但也打印它的参数

我们还可以定义
sum

def sum = { x -> x.inject { acc, val -> acc + val } }
同样地:

println sum([1,2])

def print_args_sum = print_args(sum)
println print_args_sum([1,2])
这适用于传递
arrayList
s。但是,当通过普通数组时:

Object x = new Object[2]
x[0] = 1
x[1] = 2

println sum(x)
工作正常,但有以下几点:

def print_args(f) { { Object... args -> args.each { println it }; f(*args) } }
println print_args_sum(x)
断开,因为闭包
print_args
扩展传递的数组,而不是按原样传递

有没有一种方法可以编写
print_args
,这样它就可以处理闭包
f
,这些闭包可以作为一个参数传递给单个数组,而无需对调用者施加额外的约束,或者闭包
print_args
可以处理什么


我已将代码放在ideone上。

如果对象数组被传递,则将其视为
列表

您必须这样做的原因是因为
sum
闭包只接受一个参数。对象数组上的Spread运算符在出错的情况下将产生两个参数。因此,您需要在
print_args

def print_args(f) { 
    {Object... args -> 
        args.each { println it}
        args.find{it instanceof List} ? f(*args) : f(args as List)
    }
}

这和你从我的答案中得到的答案是一样的吗?