Welchen Vorrang haben Methodenaufrufe mit und ohne Klammern?

8

Vorherige Antworten

Die Antwort zu einem ähnlichen question ist falsch.

Methodenaufrufe sind weder in der Dokumentation noch in Community-Wiki .

Methodenaufruf ohne Klammern

Höher als or

or scheint eine niedrigere Priorität zu haben als ein Methodenaufruf ohne Klammern:

%Vor%

entspricht

%Vor%

und zeigt false an.

HINWEIS: Ich weiß, dass or nicht verwendet werden sollte. Dennoch ist es ein gutes Beispiel, um zu zeigen, dass einige Operatoren einen niedrigeren Vorrang haben als Methodenaufrufe.

Kleiner als ||

%Vor%

entspricht

%Vor%

und zeigt true an.

Methodenaufruf mit Klammern

Die Klammern für den Methodenaufruf scheinen nicht zu gruppieren:

%Vor%

Frage

Wo sollten Methodenaufrufe mit und ohne Klammern in dieser Rangfolge Tabelle stehen ?

Kopfgeldklärung

Ich suche nach der genauen Position von Methodenaufrufen in der Tabelle. Vorzugsweise mit Beispielen, die beweisen, dass es niedriger ist als das vorherige und höher als das vorherige.

Die aktuellen Antworten scheinen auch Methodenaufrufe mit Klammern nicht zu erwähnen.

Vielen Dank im Voraus!

    
Eric Duminil 24.12.2016, 12:13
quelle

3 Antworten

6

Vorspiel

Dies zielt darauf ab, alle möglichen Szenarien zu testen.

Beachten Sie, wenn Sie sagen, dass "operator X eine höhere Priorität hat als der Methodenaufruf" , ist das in Argumenten gemeint. Aka:

%Vor%

im Gegensatz zu (Aufruf am Objekt)

%Vor%

Im zweiten Fall haben Methodenaufrufe immer eine höhere Priorität.

Kurze Antwort

Es passt nicht:

  • Es verursacht SyntaxError in einigen Fällen
  • Es hat eine höhere Priorität als rescue , aber niedriger als die Zuweisung

Zusammenfassung

  • not kann nicht unabhängig von eckigen Klammern
  • nach dem Methodenaufruf verwendet werden
  • Die Verwendung von Klammern ( () ) mit Methodenaufrufen verursacht manchmal SyntaxError . Diese Fälle sind: and , or , if , unless , until , while und rescue .
  • In Fällen, in denen Klammern keinen Fehler verursachen, ändern sie in keiner Weise die Priorität
  • Alle Operatoren außer and , or , postfix if , unless , until , while , rescue haben eine höhere Priorität als der Methodenaufruf

Lass es uns versuchen:

%Vor%

Zuerst unär:

%Vor%

Punkte vergeben:

  • not nach einem Methodenaufruf ist ein SyntaxError
  • alle unären Operatoren haben einen höheren Vorrang als der Methodenaufruf unabhängig von Klammern

Jetzt binär:

%Vor%

Punkte vergeben:

  • Klammern um den Methodenaufruf mit and oder or ist ein SyntaxError
  • wir müssen and und or weiter ohne Klammern
  • testen
  • .. und ... Aufruf <=> . Das müssen wir weiter testen
  • wir konnten einige andere binäre Operatoren auf diese Weise nicht testen, nämlich && , || , == , != , Modifikator rescue , if , unless , until , %Code%
  • Außer den oben genannten Operatoren haben die Operatoren eine höhere Priorität, unabhängig von den Klammern
%Vor%

Punkte vergeben:

  • while und and haben eine niedrigere Priorität ohne Klammern
  • or , && , || und == haben unabhängig von Klammern
  • eine höhere Priorität
%Vor%

Punkte vergeben:

  • != und .. haben unabhängig von Klammern
  • eine höhere Priorität
%Vor%

Punkte vergeben:

  • Klammern mit ... , if , unless , until verursachen eine while
  • alle oben genannten haben eine niedrigere Priorität als der Methodenaufruf ohne Klammern
%Vor%

Punkte vergeben:

  • Klammern um SyntaxError verursachen ein rescue
  • SyntaxError hat eine niedrigere Priorität, wenn keine Klammern vorhanden sind

Ternär:

%Vor%

Punkte vergeben:

  • ternary hat unabhängig von Klammern
  • Vorrang

Zuweisung (links für zuletzt, da sich rescue und yes ändern):

%Vor%

Punkte vergeben:

  • Zuweisung hat höhere Priorität als Aufruf

Beachten Sie, dass no und dergleichen nur Verknüpfungen für += und + sind, so dass sie dasselbe Verhalten aufweisen.

    
ndn 06.02.2017, 21:07
quelle
2

In Ruby scheint die Priorität der Methodenaufrufe niedriger zu sein als defined? , aber höher als or .

Zum Beispiel:

%Vor%

Hinweis: puts(not true) und puts(false or true) erhöhen Syntaxfehler.

    
Fede 24.12.2016 14:52
quelle
2

Aktualisierung, um die Frage tatsächlich zu beantworten.

Offiziell haben Methoden keinen Vorrang. Wie Sie jedoch zeigen, können wir sie in die Rangfolge-Liste einordnen und sie liegen zwischen dem, was wir als "Operatoren" betrachten könnten, und dem, was wir als "Kontrollfluss" -Schlüsselwörter betrachten könnten.

Siehe Ссылка

Was mit Operatoren beginnt und endet mit Kontrollflusskonstrukten wie

%Vor%

Der einzige seltsame Ball ist defined? , von dem ich nicht verstehe, warum er sowieso nicht als globale Funktion für das Kernel Modul definiert wurde.

raise , loop , catch/throw und andere fehlen?

Sie sind keine Schlüsselwörter, sondern Methodenaufrufe, die im Modul module_function als Kernel definiert sind. Und da dieses Modul in Object enthalten ist, werden sie zu privaten Methoden aller Klassen und erscheinen daher als globale Funktionen, die überall verfügbar sind.

Hoffe, dass hilft, die Frage zu beantworten. Entschuldigung für das Original copypasta.

    
akuhn 25.12.2016 01:49
quelle