2008-09-24 8 views
23

Beim Lesen über Perl 6, sehe ich ein Feature über posaunt wird, wo man nicht mehr tun müssen:Wie bewertet Perl 6 Wahrheit?

return "0 but true"; 

... aber stattdessen tun:

return 0 but True; 

Wenn das der Fall ist , wie funktioniert die Wahrheit in Perl 6? In Perl 5 war es ziemlich einfach: 0, "" und undef sind falsch, alles andere ist wahr.

Welche Regeln gibt es in Perl 6, wenn es um booleschen Kontext geht?

+1

in Perl 5 ist es üblich, '0E0' als 'Null, aber wahr' Rückgabewert – EvdB

+8

I zu verwenden Ich gebe Ihnen eine Aufwertung für den Wert "Wahrheit" in einer technischen Frage :) –

+1

@PaulDixon: Der Begriff wird auch in der Ruby-Community verwendet. –

Antwort

3

So zu kombinieren, was ich denke, das Beste aus jeder Antwort zu sein:

Wenn Sie eine Variable in Booleschen Kontext zu bewerten, seine .true() -Methode aufgerufen wird. Die Standardmethode .true(), die von einem Objekt verwendet wird, führt eine Perl 5-style < 0, "", undef> Prüfung des Objektwerts durch, aber wenn Sie "aber True" oder "aber False" sagen, wird diese Methode mit überschrieben Eine, die den Wert nicht betrachtet, gibt nur eine Konstante zurück.

Man könnte sich vorstellen, eine true() -Methode zu schreiben, die, wenn der Wert gerade war, true zurückgab, wenn sie ungerade war.

6

Laut O'Reilly Perl 6 and Parrot Essentials, falsch 0, undef, die leere Zeichenkette und Werte gekennzeichnet als falsch. true ist alles andere.

Auch Perl 6 hat sowohl einen primitiven booleschen Typ als auch Rollen, die jeden Wert mischen können (so können Sie einen "0 aber True" -Wert oder einen "1 aber False" -Wert für haben) Beispiel oder eine falsche Liste mit Elementen oder eine echte Liste, die leer ist).

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

+2

Dieses Buch ist uralt und repräsentiert nicht den aktuellen Stand der Sprache. –

11

Synopsis 12: Roles See.

Die Regeln sind die gleichen, aber das "aber" kopiert die 0 und wendet eine Rolle auf die Kopie an, die bewirkt, dass sie im booleschen Kontext wahr ist.

Sie können ihren Wert, indem er das Objekt eine Frage anstatt sich mit Überlastung in Perl 5.

+1

Äh, meinst du nicht "wahr in einem booleschen Kontext"? – Ovid

15

Perl 6 wertet Wahrheit jetzt das Gleiche tun. Der Wert ist nicht das Objekt. Es ist etwas, was mir an anderen Objektsprachen gefallen hat und ich bin froh, dass ich in Perl habe: Ich kann entscheiden, wie das Objekt reagiert und das kann mutieren. Wie du schon sagtest, könntest du das in Perl 5 mit Überlastung machen, aber ich habe immer das Gefühl, dass ich meine Hände waschen muss, nachdem ich es so gemacht habe. :)

Wenn Sie nichts tun, um das zu ändern, verhält sich Perl 6 genauso wie Perl 5, so dass Sie die geringste Überraschung bekommen.

+1

Das wäre objektorientierter als Ruby - nur 'false' und' nil' fehlen Wahrheit, und es gibt nichts, was Sie dagegen tun können, es sei denn, Sie nehmen '' '' '' '' '' '' '' '' '' '' '' '. –

11

Truthness Test ruft nur die .true Methode für ein Objekt auf, so dass die "mix in" Operation $stuff but True nur (unter anderem) diese Methode überschreibt.

Dies ist in S02 angegeben, allgemein enum Typen (von denen Bool ist eins) sind in S12 beschrieben.

1

Ein falscher Wert, der fast überall vernachlässigt wird, ist "0". Ich machte vor kurzem diese schmerzhafte Entdeckung, dass "0" ist falsch in PERL 5. Gee. Eine nicht leere Zeichenfolge, die falsch ist. Ich hatte wirklich gehofft, dass sich das in PERL6 ändern würde, aber ich denke nicht.

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

Die || = Idiom einige Saiten clobbered ich wirklich nicht erwartet hatte:

$ perl -e '$x = "0"; $x ||= ""; print ">>$x<<\n";' 
>><< 
+0

Deshalb ist [defined-or] (http://perltraining.com.au/tips/2008-03-03.html) '//' so schön. Es ist aktiviert (beginnend in Perl 5.10) mit 'use 5.010'. –

+0

Hoppla, ich habe mich gerade daran erinnert, dass seit der Definition - oder nicht im Konflikt mit der vorherigen Syntax, ist es standardmäßig aktiviert. –