27

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

return "0 but true";

...但可以改为:

return 0 but True;

如果是这样,真理在 Perl 6 中是如何工作的?在 Perl 5 中,这非常简单:0、"" 和 undef 为假,其他一切都为真。

Perl 6 中关于布尔上下文的规则是什么?

4

6 回答 6

18

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

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

于 2008-09-24T07:38:08.923 回答
11

参见概要 12:角色

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

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

于 2008-09-24T03:47:51.427 回答
11

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

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

于 2008-09-24T07:44:00.000 回答
6

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

此外,Perl 6 既有原始布尔类型,也有任何值都可以混合的 True 和 False角色(例如,您可以拥有“0 但为真”值或“1 但为假”值,或假列表包含元素,或为空的真实列表)。

请参阅http://www.mail-archive.com/macosx@perl.org/msg09930.html

于 2008-09-24T03:42:13.950 回答
3

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

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

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

于 2008-09-24T14:28:45.097 回答
1

几乎在任何地方都被忽略的一个错误值是“0”。我最近痛苦地发现 PERL 5 中的“0”是错误的。哎呀。一个错误的非空字符串。我真的希望这会在 PERL6 中有所改变,但我想不会。

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

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

$ perl -e '$x = "0"; $x ||= ""; print ">>$x<<\n";'
>><<
于 2014-05-02T17:31:25.677 回答