Perl 6如何评估真实性?

问题描述 投票:26回答:6

在阅读有关Perl 6的内容时,我看到一个被大肆宣扬的功能,您不再需要这样做:

return "0 but true";

...但可以改为:

return 0 but True;

如果是这样的话,真相如何在Perl 6中发挥作用?在Perl 5中,它很简单:0,“”和undef都是假的,其他一切都是真的。

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

perl6 truthiness
6个回答
16
投票

Perl 6现在通过向对象询问问题而不是查看其值来评估真相。该值不是对象。这是我喜欢的其他对象语言,并且很乐意在Perl中使用:我可以决定对象如何响应并且可以改变它。正如ysth所说,你可以在Perl 5中做到超载,但我总是觉得我这样做后必须洗手。 :)

如果你没有做任何改变,Perl 6的行为与Perl 5相同,所以你得到的惊喜最少。


11
投票

真值测试只是在一个对象上调用.true方法,所以“混合”操作$stuff but True只是(除其他外)覆盖了该方法。

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


11
投票

Synopsis 12: Roles

规则是相同的,但“但”复制0并将一个角色应用于导致它在布尔上下文中为真的副本。

你可以在Perl 5中使用重载做同样的事情。


6
投票

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

此外,Perl 6既有原始的布尔类型,也有任何值可以混合的True和False角色(例如,你可以有一个“0但是真”值或者“1但是假”,或者一个错误的列表包含元素,或者是空的真实列表。

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


3
投票

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

在布尔上下文中计算变量时,会调用其.true()方法。对象使用的默认.true()方法对对象的值执行Perl 5样式的<0,“”,undef>检查,但是当您说“但是为真”或“但是为假”时,此方法将被覆盖一个不看值的只返回一个常量。

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


1
投票

几乎无处不在的一个错误值是“0”。我最近发现这个痛苦的发现,PERL 5中的“0”是假的。非空字符串,为false。我真的希望PERL6会改变,但我猜不会。

> if ( "0" ) { say "True" } else { say "False" }
False

|| =成语破坏了我真正没想到的一些字符串:

$ perl -e '$x = "0"; $x ||= ""; print ">>$x<<\n";'
>><<
© www.soinside.com 2019 - 2024. All rights reserved.