Perl 6 について読んでいると、もうやらなくていいという機能が大々的に宣伝されているのがわかります。
return "0 but true";
...しかし、代わりに次のことができます:
return 0 but True;
その場合、真実は Perl 6 でどのように機能しますか? Perl 5 では、非常に単純でした: 0、""、および undef は false で、それ以外はすべて true です。
ブーリアンコンテキストに関するPerl 6のルールは何ですか?
Perl 6 について読んでいると、もうやらなくていいという機能が大々的に宣伝されているのがわかります。
return "0 but true";
...しかし、代わりに次のことができます:
return 0 but True;
その場合、真実は Perl 6 でどのように機能しますか? Perl 5 では、非常に単純でした: 0、""、および undef は false で、それ以外はすべて true です。
ブーリアンコンテキストに関するPerl 6のルールは何ですか?
Perl 6 は、オブジェクトの値を見る代わりに、オブジェクトに質問をすることによって真実を評価するようになりました。値はオブジェクトではありません。これは、私が他のオブジェクト言語で気に入っているものであり、Perl で使用できることを嬉しく思います。オブジェクトがどのように応答するかを決定し、それを変更することができます。ysth が言ったように、Perl 5 ではオーバーロードを使用してそれを行うことができましたが、そのように行った後は手を洗う必要があるといつも感じています。:)
それを変更するために何もしなければ、Perl 6 は Perl 5 と同じように動作するので、驚くことはほとんどありません。
Synopsis 12: Rolesを参照してください。
ルールは同じですが、「but」は 0 をコピーし、そのコピーに役割を適用して、ブール コンテキストで true にします。
Perl 5 のオーバーロードでも同じことができます。
O'Reilly のPerl 6 および Parrot Essentialsによると、falseは 0、undef、空の文字列、およびfalseとしてフラグ付けされた値です。trueはその他すべてです。
また、Perl 6 には、プリミティブなブール型と、任意の値を混在させることができる True と Falseの役割の両方があります (したがって、たとえば、「0 であるが True」の値または「1 であるが False」の値、または false リストを持つことができます)。要素を含む、または空の真のリスト)。
http://www.mail-archive.com/macosx@perl.org/msg09930.htmlを参照してください。
だから、私がみんなの答えの中で最高だと思うものを組み合わせるために:
ブール値のコンテキストで変数を評価すると、その .true() メソッドが呼び出されます。オブジェクトによって使用されるデフォルトの .true() メソッドは、オブジェクトの値の Perl 5 スタイルの <0, "", undef> チェックを行いますが、「but True」または「but False」と言うと、このメソッドは次のようにオーバーライドされます。値を見ないものは定数を返すだけです。
たとえば、値が偶数のときに true を返し、奇数のときに false を返す true() メソッドを作成することが考えられます。
ほとんどどこでも無視される偽の値の 1 つは、「0」です。私は最近、PERL 5では "0" が偽であるという痛ましい発見をしました。false である空でない文字列。私は本当にPERL6でそれが変わることを望んでいましたが、そうではないと思います.
> if ( "0" ) { say "True" } else { say "False" }
False
||= イディオムは、私が本当に予期していなかったいくつかの文字列を破壊しました:
$ perl -e '$x = "0"; $x ||= ""; print ">>$x<<\n";'
>><<