【发布时间】:2010-10-18 20:02:02
【问题描述】:
在Perl 5和Perl 6之间对differences的总结中,注意到wantarray函数不见了:
wantarray() 不见了
wantarray 不见了。在 Perl 6 中,上下文 向外流动,这意味着一个 例程不知道它在哪个上下文中 在里面。
相反,您应该返回符合以下条件的对象 在各种情况下做正确的事。
有人可以提供一个如何创建此类对象的示例吗?
【问题讨论】:
在Perl 5和Perl 6之间对differences的总结中,注意到wantarray函数不见了:
wantarray() 不见了
wantarray 不见了。在 Perl 6 中,上下文 向外流动,这意味着一个 例程不知道它在哪个上下文中 在里面。
相反,您应该返回符合以下条件的对象 在各种情况下做正确的事。
有人可以提供一个如何创建此类对象的示例吗?
【问题讨论】:
我认为 2 个例子可能是:
http://perlcabal.org/syn/S13.html#Type_Casting
一个类可以定义允许它像例程、数组或散列一样响应的方法。长格式如下:
method postcircumfix:<( )> ($capture) {...}
method postcircumfix:<[ ]> (**@slice) {...}
method postcircumfix:<{ }> (**@slice) {...}
这些有点笨拙,所以你也可以使用这些简短的形式:
method &.( $capture ) {...}
method @.[ **@slice ] {...}
method %.{ **@slice } {...}
另外,我认为这可能是相关的,但不太相关:http://perlcabal.org/syn/S12.html
搜索:
您可以编写自己的访问器来覆盖任何或所有自动生成的访问器。
因此,您返回一个具有多个特定于上下文的访问器的对象。
有趣的是,它从 Perl6 开始用通用的“want”替换“wantarray”:RFC 98 (v1) context-based method overloading, circa 2000,也在http://dev.perl.org/perl6/rfc/21.html。我不确定为什么/何时进行更改。
【讨论】:
Reddit 上的这个 comment 关于博文 Immutable Sigils and Context 给出了以下示例:
class GeoLocation is Array {
method Str { 'middle of nowhere' }
}
sub remote_location {
return GeoLocation.new(1e6 xx 3);
}
# or even easier:
sub remote_location {
return (1e6 xx 3) but 'middle of nowhere';
}
【讨论】: