10
votes

"Ou" doit-il être placé à la fin de la ligne précédente? (Torop inattendu)

Je suis en cours d'exécution Ruby 1.9.

Ceci est une syntaxe valide: xxx

mais cela me donne une erreur: xxx

pourquoi ?!


0 commentaires

3 Réponses :


4
votes

Ruby interprète la fin de la ligne comme fin de déclaration. Les opérateurs indiquent la poursuite d'une déclaration.

Vous pouvez utiliser BacksLash \ code> pour indiquer la suite ainsi que les suivants fonctionnent donc P>

items = (data['DELETE'] || data['delete'] \
     || data['GET'] || data['get'] || data['POST'] || data['post'])


0 commentaires

8
votes

Ce que je peux dire, c'est "C'est comme ça que ça marche".

L'analyseur Ruby fait un travail incroyable, en général, de déterminer lorsqu'une expression doit continuer sur une autre ligne. À peu près toutes les autres langues du monde parle complètement sur ce problème et nécessite un caractère réel de continuer à suivre la ligne suivante ou de mettre fin à la déclaration.

Comme vous le savez, Ruby est spécial dans ce domaine, presque toujours, Il ne le fait que le chiffre.

Dans ce cas, cependant, il y a un conflit. L'analyseur sait que votre expression n'est pas terminée, car il cherche toujours le ) , mais cela pourrait être une expression composée.

Par exemple, vous pouvez écrire quelque chose comme Ceci: xxx

... mais en utilisant le Terminator SoftWline Soft au lieu de ; ... Cette syntaxe ci-dessous fonctionne réellement: xxx

(BTW, la valeur de cette expression est la valeur de la dernière expression dans la séquence.)

ruby ​​ne peut pas analyser votre déclaration et le dessus Sans une meilleure ascension telle qu'un opérateur binaire qui nécessite clairement une autre ligne.


2 commentaires

Je ne sais pas si "un travail étonnant" est correct (je dirais que c'est impair comme l'expression peut continuer être poursuivi par un opérateur sur une ligne suivante), Mais C'est ainsi que la langue rubis (verrues et toutes) est définie de +1. (JavaScript gère cela différemment - et peut-être plus "attendu" - avec quelques productions restreintes pour ASI.)


En fait: Scala et Python - également qui ne nécessitent pas de semi-couches - aussi manipulez cela différemment, et peut-être de «attendu», comparé au rubis. Ils ne soutiennent pas ce dernier formulaire argumenté pour la réponse (entre parenthèses et aucun séparateur de déclaration), ce qui est une construction impair-ish).



2
votes

Puisque Ruby est orienté ligne, des déclarations qui se terminent par un opérateur sont interprétées comme incomplètes. Ajout d'une barre oblique inverse une fois que l'opérateur autorisera l'instruction multiligne à être interprétée correctement. (Source: http://phrogz.net/programmingRuby/language.html )


0 commentaires