如何在Perl中实现带参函数引用绑定,无需包装子函数?
Perl 绑定预填充参数的子函数引用实现方案
首先明确注释代码失效的原因:*p1::dump_it("but this doesn't")是直接执行了dump_it函数,并将函数的返回值(此处dump_it无显式返回,实际是print的执行状态值)赋值给*foo,而非绑定带预设参数的函数引用,所以后续调用foo()自然无法得到预期结果。
不用额外编写命名包装函数的前提下,可以通过匿名闭包直接实现带预填充参数的函数引用绑定,代码示例如下:
#!/usr/bin/perl package p1; use Data::Dumper; sub dump_it { print Dumper @_ } package p2; local *foo = *p1::dump_it; foo('this works'); # 实现预设参数的绑定 local *foo = sub { p1::dump_it("but this does work", @_) }; foo(); # 输出预设参数 foo('plus extra arguments'); # 同时支持追加额外参数
原理说明
匿名子函数作为闭包,会捕获预设的参数值,在调用foo()时,自动将预设参数与调用时传入的参数(如果有的话)一并传递给p1::dump_it,既满足了直接绑定引用的需求,又实现了参数预填充的效果,且没有创建额外的命名包装函数。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

