Ich hatte in letzter Zeit einige Probleme damit, dass ein Pfad richtig funktioniert. Die Lösung erwies sich als einfach, aber ich hatte ein unerwartetes Problem, das mich daran hinderte. Die folgende Zeile, die in einer Erb-Vorlage enthalten ist, funktioniert perfekt:
%Vor%Dies tut nicht:
%Vor%Es scheint, dass der Abstand vor der öffnenden Klammer in diesem Fall nicht erlaubt ist. Der Fehler, den ich bekomme, ist dies:
%Vor%Kann jemand erklären, warum dies einen Fehler verursacht?
EDIT: für Info, das ist Ruby 1.9.2 und Rails 3.0.9, auf Windows 7 64-Bit
Wer vor den Klammern einer Parameterliste ein Leerzeichen setzt, bekommt das, was er verdient, sage ich!
Das Problem ist, dass es den Aufruf von button_to
im zweiten Beispiel (Leerzeichen vor den Klammern) schließt und nicht weiß, was als nächstes zu tun ist.
Ich bin mir nicht sicher, ob Ruby's Parser tatsächlich so funktioniert, aber ich denke so: Das Komma vor delivery_confirm_path
hat einen höheren Vorrang als die Klammern, es sei denn, du entfernst den Platz.
Der Parser sieht den Methodenaufruf folgendermaßen:
%Vor% Mit anderen Worten, delivery_confirm_path
wird als Methodenaufruf ohne Argumente analysiert. Aber dann sieht der Parser das hängende ( @delivery )
und es ist keine gültige Syntax, weil es dem Methodenaufruf button_to
folgt. Es ist, als hätten Sie diese ungültige Syntax:
Sie können die Kommapriorität umgehen, indem Sie stattdessen Folgendes tun:
%Vor%Aber es ist normalerweise einfacher, den Platz einfach zu entfernen.
Wenn Sie bei einem Methodenaufruf ein Leerzeichen vor den Klammern verwenden, werden die Klammern als Gruppierung und nicht als Klammern für die Methodenaufrufe verwendet.
Hier sind einige Beispiele, die helfen sollen. Ich verwende die folgende Methode in meinen Beispielen:
%Vor% Wenn du auf Ruby 1.9 stehst, schlage ich vor, bei der Ausführung der Beispiele Warnungen zu aktivieren: $-w = true
. Dies zeigt warning: (...) interpreted as grouped expression
an, wenn Sie Leerzeichen vor Klammern haben.
Diese beiden Zeilen sind syntaktisch äquivalent:
%Vor% Das liegt daran, dass (1)
als gruppierter Ausdruck nur 1
ist.
Was nützt die Gruppierung?
Ein Grund ist nur für mehr Lesbarkeit. Sie könnten es leichter finden, mit Parens in diesem Ausdruck zu verstehen, ohne:
%Vor% Ein anderer Grund ist der Vorrang. Nehmen wir an, ich habe eine Operation mit niedriger Priorität, wie der Operator and
. Da der Methodenaufruf Vorrang hat, wird and
nach dem Aufruf ausgewertet. Dies gibt [2]
aus und gibt 3
zurück:
Aber dies druckt [3]
und gibt true
zurück:
Beachten Sie jedoch, dass das Beispiel and
etwas erfunden ist, weil Ruby das Entfernen des vorhergehenden Platzes nicht erlaubt. (Ich bin nicht sicher, warum, denn &&
ist erlaubt, anstatt and
.) Aber Sie bekommen die Idee.
Dies zeigt, dass durch das Entfernen des Leerzeichens vor einem Methodenaufruf der Methodenaufruf Vorrang vor einem Komma erhält:
%Vor%Ein weiteres Problem ist die Argumentliste.
%Vor%Tags und Links ruby ruby-on-rails