如何创建可调用变量以调用带指定参数的类方法?
解决方法
要实现让可调用变量自动传入'up'执行walk方法,有几种实用方式:
方式一:绑定实例的方法引用 + assuming
直接从实例上获取已绑定self的方法引用,再用assuming固定方向参数:
class Person { method walk(Str $direction) { say "Walking $direction"; } } my $person = Person.new; my $callable = $person.&walk.assuming('up'); $callable(); # OUTPUT: Walking up
方式二:闭包封装逻辑
用闭包直接把调用逻辑包起来,直观易懂:
my $callable = { $person.walk('up') }; $callable(); # OUTPUT: Walking up
方式三:手动绑定方法的self参数
如果一定要用^find_method,需要先把实例(self)作为第一个参数绑定到方法对象上,再固定方向参数:
my $method = Person.^find_method('walk'); my $callable = $method.assuming($person, 'up'); $callable(); # OUTPUT: Walking up
错误原因说明
你之前的代码出错核心原因是:
^find_method拿到的是未绑定实例的方法对象,它的第一个参数必须是实例(self)。直接调用$person.^find_method('walk')('up')时,只传了'up',缺少self参数,所以报"Too few positionals passed"。- 用
.assuming('up')后,方法对象的第一个参数被固定为'up',当你用$person.$callable()调用时,Perl 6会自动把$person作为参数传给这个可调用对象,导致原本应该接收Str类型$direction的位置收到了Person实例,触发类型检查错误。
内容的提问来源于stack exchange,提问作者Jim Bollinger
相关产品推荐
相关产品推荐

