如何在Perl 6中返回上下文敏感的返回值?

时间:2010-10-18 20:02:03

标签: perl perl6 perl5 raku

在Perl 5和Perl 6之间differences的摘要中,注意到wantarray函数已经消失:

  

wantarray()消失了

     

欲望阵线消失了。在Perl 6中,上下文   向外流动,这意味着一个   例程不知道它在哪个上下文中   是在。

     

相反,你应该返回那些对象   在每种情况下做正确的事。

有人可以举例说明如何创建这样的对象吗?

2 个答案:

答案 0 :(得分:4)

我认为可能有两个例子:


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将“wantarray”替换为通用的“want”:RFC 98 (v1) context-based method overloading, circa 2000,同样在http://dev.perl.org/perl6/rfc/21.html。我不确定为什么/何时做出改变。

答案 1 :(得分:3)

关于博文comment的关于Reddit的这个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';
}