Quello che posso dire è "che è solo come funziona".
Il parser di Ruby svolge un ottimo lavoro, in generale, di capire quando un'espressione deve continuare su un'altra linea. Quasi tutti gli altri linguaggi del mondo si occupano completamente di questo problema e richiedono un personaggio reale per continuare o per terminare la frase successiva.
Come sapete, Ruby è speciale in questo, quasi sempre, lo capisce.
In questo caso, tuttavia, c'è un conflitto. Il parser sa che la tua espressione non è finita, perché sta ancora cercando il )
, ma potrebbe essere un'espressione composta.
Ad esempio, si potrebbe scrivere qualcosa di simile:
(p :a; p :b; p :c)
... ma utilizzando la nuova linea di terminazione morbida invece di ;
... questa sintassi sotto realtà non funziona:
(p :a
p :b
p :c)
(BTW, il valore di tale espressione è il valore dell'ultima espressione nella sequenza.)
Ruby non può analizzare sia la tua istruzione sia quella precedente con un suggerimento migliore come un operatore binario che richiede chiaramente un'altra linea.
Non sono sicuro che "lavoro straordinario" sia corretto (direi che è * strano * poiché l'espressione * può * essere continuata da un operatore su una riga successiva), * ma * è il modo in cui il linguaggio Ruby (verruche e tutto) è definito in modo +1. (JavaScript gestisce questo in modo diverso - e forse più "prevedibilmente" - con alcune produzioni limitate per ASI.) –
In realtà: Scala e Python - anche quelli che non richiedono il punto e virgola - * anche * gestiscono diversamente e forse "prevedibilmente" , rispetto a Ruby. Non supportano però la seconda forma argomentata per la risposta (con parentesi e nessun separatore di istruzioni), che è un costrutto strano-ish). –