27

Perl 6 について読んでいると、もうやらなくていいという機能が大々的に宣伝されているのがわかります。

return "0 but true";

...しかし、代わりに次のことができます:

return 0 but True;

その場合、真実は Perl 6 でどのように機能しますか? Perl 5 では、非常に単純でした: 0、""、および undef は false で、それ以外はすべて true です。

ブーリアンコンテキストに関するPerl 6のルールは何ですか?

4

6 に答える 6

18

Perl 6 は、オブジェクトの値を見る代わりに、オブジェクトに質問をすることによって真実を評価するようになりました。値はオブジェクトではありません。これは、私が他のオブジェクト言語で気に入っているものであり、Perl で使用できることを嬉しく思います。オブジェクトがどのように応答するかを決定し、それを変更することができます。ysth が言ったように、Perl 5 ではオーバーロードを使用してそれを行うことができましたが、そのように行った後は手を洗う必要があるといつも感じています。:)

それを変更するために何もしなければ、Perl 6 は Perl 5 と同じように動作するので、驚くことはほとんどありません。

于 2008-09-24T07:38:08.923 に答える
11

Synopsis 12: Rolesを参照してください。

ルールは同じですが、「but」は 0 をコピーし、そのコピーに役割を適用して、ブール コンテキストで true にします。

Perl 5 のオーバーロードでも同じことができます。

于 2008-09-24T03:47:51.427 に答える
11

.true真実性テストはオブジェクトのメソッドを呼び出すだけなので、「ミックスイン」操作$stuff but Trueは(とりわけ)そのメソッドをオーバーライドします。

これはS02で指定され、一般に enum 型 (Bool がその 1 つ) はS12で記述されます。

于 2008-09-24T07:44:00.000 に答える
6

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を参照してください。

于 2008-09-24T03:42:13.950 に答える
3

だから、私がみんなの答えの中で最高だと思うものを組み合わせるために:

ブール値のコンテキストで変数を評価すると、その .true() メソッドが呼び出されます。オブジェクトによって使用されるデフォルトの .true() メソッドは、オブジェクトの値の Perl 5 スタイルの <0, "", undef> チェックを行いますが、「but True」または「but False」と言うと、このメソッドは次のようにオーバーライドされます。値を見ないものは定数を返すだけです。

たとえば、値が偶数のときに true を返し、奇数のときに false を返す true() メソッドを作成することが考えられます。

于 2008-09-24T14:28:45.097 に答える
1

ほとんどどこでも無視される偽の値の 1 つは、「0」です。私は最近、PERL 5では "0" が偽であるという痛ましい発見をしました。false である空でない文字列。私は本当にPERL6でそれが変わることを望んでいましたが、そうではないと思います.

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

||= イディオムは、私が本当に予期していなかったいくつかの文字列を破壊しました:

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