Perl 6如何评估真实性?

时间:2020-03-06 14:38:27  来源:igfitidea点击:

在阅读有关Perl 6的文章时,我看到一个功能被吹捧了,我们不再需要这样做:

return "0 but true";

...但是可以代替:

return 0 but True;

如果是这样,真理在Perl 6中如何工作?在Perl 5中,这非常简单:0,""和undef为false,其他所有为true。

关于布尔上下文,Perl 6中有哪些规则?

解决方案

根据O'Reilly的Perl 6和Parrot Essentials,false为0,undef为空字符串,值标记为false。真的是其他一切。

另外,Perl 6具有原始的布尔类型,并且具有可以混入任何值的True和False角色(因此,例如,我们可以具有" 0但True"值或者" 1但False"值,或者为假列表包含元素,或者为空的真实列表)。

参见http://www.mail-archive.com/[email protected]/msg09930.html

请参阅提要12:角色。

规则是相同的,但是" but"会复制0并将一个角色应用于该副本,从而使其在布尔上下文中为true。

我们可以在Perl 5中使用重载来执行相同的操作。

现在,Perl 6通过询问对象一个问题而不是查看其值来评估真理。该值不是对象。这是我对其他对象语言所钟爱的,在Perl中我会很高兴:我可以决定对象如何响应并可以对其进行更改。正如ysth所说,我们可以在Perl 5中以超载的方式执行此操作,但是我总是觉得这样做后必须洗手。 :)

如果我们不做任何更改,Perl 6的行为与Perl 5相同,那么我们所得到的惊喜最少。

真实性测试只是在对象上调用.true方法,因此"混合"操作$ stuff but True会(除其他外)覆盖该方法。

这是在S02中指定的,通常在S12中描述枚举类型(Bool是其中的一种)。

因此,结合我认为是每个人的最佳答案:

在布尔上下文中评估变量时,将调用其.true()方法。对象使用的默认.true()方法对对象的值进行Perl 5样式的<0,"",undef>检查,但是当我们说" but True"或者" but False"时,此方法将被覆盖一个不看值的函数只会返回一个常数。

可以想象编写一个true()方法,例如,当该值是偶数时返回true,而当它是奇数时返回false。