2009-09-16 6 views

Antwort

15

Meine Vermutung ist, dass es eine direkte Übertragung von Perl ist. Die Operatoren or und and wurden später in Perl 5 für bestimmte Situationen hinzugefügt, in denen eine niedrigere Priorität gewünscht wurde.

Zum Beispiel in Perl, hier wollen wir, dass || niedrigere Priorität hatte, so dass wir schreiben können:

try to perform big long hairy complicated action  || die ; 

und sicher sein, dass die || wollte Teil der Aktion nicht verschlingen. Perl 5 eingeführt or, eine neue Version von ||, die niedrige Präzedenz für genau diesen Zweck hat.

Ein Beispiel in Ruby, wo Sie or aber nicht || verwenden:

value = possibly_false or raise "foo" 

Wenn Sie || verwendet, wäre es ein Syntaxfehler sein.

+0

Gibt es einen Namen für das Idiom von do_something oder stirb? Wird es in Rubin verwendet? –

+0

Ich kenne keinen Namen dafür, aber es ist ziemlich häufig in Ruby. – Chuck

+0

Perl lehnt sich stark an Würfel, während Ruby Raise verwendet. Der Vorteil einer Ausnahme ist, dass Sie sie retten können. – tadman

4

Die Möglichkeit, die Priorität Ihrer Operatoren zu steuern, ist manchmal nützlich, besonders wenn Sie sich mit Lesbarkeit befassen - zusätzliche Klammern in bedingten Anweisungen können manchmal die tatsächliche Logik verdecken.

Um ehrlich zu sein, denke ich, der Grund Ruby hat die boolesche Operator Vorrang Ebenen Ebenen stammt vor allem aus der Tatsache, dass Matz war ein Perl-Programmierer, bevor er jemals schrieb Ruby, und entlehnte viel von der Kern-Syntax und Operatoren aus diese Sprache.

+0

hmm, das erklärt warum Rubin so unreif und gleichzeitig so aufgebläht ist. Immer noch schwer, meinen Kopf darum zu wickeln. – akostadinov

5

Sie haben eine sehr niedrige Priorität, so dass die Operanden nicht in Klammern eingeschlossen werden müssen, wie es manchmal bei && und || der Fall ist.

2

Ich glaube, dass die Idee ist, sie unter den Zuweisungsoperatoren zu bekommen, so dass Sie logische Tests mit Zuweisungen schreiben können, aber ohne Parens.

7

Der Unterschied hat Vorrang. ||, && haben höhere Priorität als =, aber and, or haben niedrigere. So, während Sie tun können:

a = nil || 0 

würden Sie tun müssen:

a = (nil or 0) 

gleichen Effekt zu erzielen. Wenn Sie dies tun:

a = nil or 0 

Das Ergebnis von Ausdruck wäre immer noch 0, aber ein Wert wäre Null.

Verwandte Themen