Ruby Whitespace

Gibt es unterschiedliche Empfindlichkeiten/Einstellungen für Leerzeichen in Ruby?

Ich habe ein RoR-Projekt, bei dem ein aktiver Anruf viele Komponenten enthält:

    max_stuff = FooSummary.select("max(stuff) as stuff")
                        .joins(:foo => :bar)
                        .where("user_id = ? and record_date < ?", r.user_id, r.record_date)
                        .group("user_id")
                        .first

1.9.3 funktioniert gut auf meinem Mac, aber auf dem Ubuntu-Server, auf dem es läuft, beschwert es sich darüber, dass .joins in einer separaten Zeile ist (unerwartet. KEND erwartet)

was gibt?

1
hinzugefügt bearbeitet
Ansichten: 1
versuchte sowohl 1.8 als auch 1.9.3
hinzugefügt der Autor kolosy, Quelle

5 Antworten

Diese Syntax wurde in ruby 1.9.1 eingeführt :

Language core changes

  • New syntax and semantics
    • Newlines allowed before ternary colon operator (:) and method call dot operator (.)

Wahrscheinlich läuft auf Ihrem Server eine ältere Ruby-Version, d. H. 1.9.0 oder 1.8.x.

8
hinzugefügt

Verschieben Sie die Periode in die vorherige Zeile. Wenn Sie Zeile für Zeile analysieren,

foo = bar

sieht wie eine vollständige Anweisung aus, und die nächste Zeile, getrennt genommen, ist ein Syntaxfehler:

.baz

Dies kann jedoch keine Aussage sein:

foo = bar.

und der Parser weiß, dass er auch die nächste Zeile anhängen muss:

baz

(was wie erwartet die gleiche Analyse ergibt wie foo = bar.baz ).

5
hinzugefügt
@muistooshort: Ja, tatsächlich. Schon abgedeckt, und sehr gut, von Stefan. Ich gab eine Aufwertung und alles.
hinzugefügt der Autor Amadan, Quelle

Könnte sein

max_stuff = FooSummary.select("max(stuff) as stuff") \
                    .joins(:foo => :bar) \
                    .where("user_id = ? and record_date < ?", r.user_id, r.record_date) \
                    .group("user_id") \
                    .first
1
hinzugefügt

Setzen Sie dottes am Ende der Linien

max_stuff = FooSummary.select("max(stuff) as stuff").
                       joins(:foo => :bar).
                       where("user_id = ? and record_date < ?", r.user_id, r.record_date).
                       group("user_id").
                       first
0
hinzugefügt

Sie können auch verschiedene Kombinationen der folgenden Möglichkeiten ausprobieren, wobei entweder ( endet die Zeile oder ) die Zeile beginnt. Hier zeige ich beides, und Sie können sich nach Ihren Wünschen einstellen.

max_stuff = FooSummary.select(
                              "max(stuff) as stuff"
                     ).joins(
                             :foo => :bar
                     ).where(
                             "user_id = ? and record_date < ?", r.user_id, r.record_date
                     ).group(
                             "user_id"
                     ).first
0
hinzugefügt