在阅读有关 Perl 6 的文章时,我看到一个功能被吹捧,您不再需要这样做:
return "0 but true";
...但可以改为:
return 0 but True;
如果是这样,真理在 Perl 6 中是如何工作的?在 Perl 5 中,这非常简单:0、"" 和 undef 为假,其他一切都为真。
Perl 6 中关于布尔上下文的规则是什么?
在阅读有关 Perl 6 的文章时,我看到一个功能被吹捧,您不再需要这样做:
return "0 but true";
...但可以改为:
return 0 but True;
如果是这样,真理在 Perl 6 中是如何工作的?在 Perl 5 中,这非常简单:0、"" 和 undef 为假,其他一切都为真。
Perl 6 中关于布尔上下文的规则是什么?
Perl 6 现在通过向对象提问而不是查看其值来评估真相。值不是对象。这是我喜欢其他对象语言的地方,并且很高兴在 Perl 中拥有它:我可以决定对象如何响应并可以改变它。正如 ysth 所说,你可以在 Perl 5 中使用过载来做到这一点,但我总是觉得这样做后我必须洗手。:)
如果你不做任何改变,Perl 6 的行为方式与 Perl 5 相同,所以你得到的惊喜最少。
根据 O'Reilly 的Perl 6 和 Parrot Essentials,false为 0,undef 为空字符串,值标记为false。其他的都是真的。
此外,Perl 6 既有原始布尔类型,也有任何值都可以混合的 True 和 False角色(例如,您可以拥有“0 但为真”值或“1 但为假”值,或假列表包含元素,或为空的真实列表)。
请参阅http://www.mail-archive.com/macosx@perl.org/msg09930.html
因此,结合我认为每个人的最佳答案:
当您在布尔上下文中评估变量时,将调用其 .true() 方法。对象使用的默认 .true() 方法对对象的值进行 Perl 5 样式的 <0, "", undef> 检查,但是当您说“但 True”或“但 False”时,此方法会被覆盖一个不看值的只是返回一个常数。
可以想象编写一个 true() 方法,例如,当值是偶数时返回真,当它是奇数时返回假。
几乎在任何地方都被忽略的一个错误值是“0”。我最近痛苦地发现 PERL 5 中的“0”是错误的。哎呀。一个错误的非空字符串。我真的希望这会在 PERL6 中有所改变,但我想不会。
> if ( "0" ) { say "True" } else { say "False" }
False
||= 成语破坏了一些我真的没想到的字符串:
$ perl -e '$x = "0"; $x ||= ""; print ">>$x<<\n";'
>><<