Perl 6如何评估真实性?
在阅读有关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。