9
votes

Est-ce qu'il importe si une déclaration conditionnelle vient avant ou après l'expression?

Désolé si c'est une question stupide, mais je suis un c # gars qui se marie autour de Ruby ..

dans Ruby, je remarque beaucoup de gens le font: P>

if 1 = 1 do_something(with params)


1 commentaires

C'est surtout stylistique. Lorsque vous traitez avec une seule ligne de code, j'utilise le suivi conditionnel car il semble avoir plus de sens en conversation. Étant donné qu'un composant de logiciels de rédaction de grand rendement le rend maintable, j'essaie de l'écrire d'une manière qui lui permet de glisser facilement dans le cerveau. Certains livres recommandent d'utiliser un bloc ou une enveloppe conditionnelle si (bla) ... Quelques ... Fin Seulement, affirmant que c'est mieux pour une expansion future du code. Si nous devons ajouter quelque chose, la fermeture fin est déjà là. Je trouve que beaucoup facile avec mes puissances Vim de travailler autour de cela, donc j'utilise une seule ligne surtout.


5 Réponses :


4
votes

Fire up IRB et exécutez votre code et vous apprendrez:

  • 1 = 1 est une erreur de syntaxe, passe à 1 == 1.
  • Vous ne pouvez pas avoir d'expression directement après si 1 == 1 , vous devrez ajouter un : ou puis et fermer avec un fin .

    Le trailing si ne doit vraiment être utilisé que pour les expressions simples et vous ne pouvez pas ajouter un sinon . Ils s'appellent modificateurs de déclaration et ils ne sont que du sucre syntaxique pour une meilleure lisibilité. Je ne suis pas totalement contre eux mais je vous recommande de les utiliser avec parcimonie.


0 commentaires

4
votes

C'est Syntaxtic Sugar ... nous permettant d'écrire du code de manière plus facile à lire.

http://rubylearning.com/satishatalim/ruby_syntactic_sugar.html p>

Remarque: Pour @Progz, ce qui suit n'est pas le même! Assurez-vous que vous n'essayez pas d'attribuer une valeur à la variable au lieu de comparer une variable à une valeur! Aussi, comme expiration de Phrogz, l'ordre de mission variable fait une grande différence ... voir @Phrogz Répondre pour plus de détails! P>

if 1 = 1 then do_something(with params) end
if 1 == 1 then do_something(with params) end


0 commentaires

7
votes

Ce dernier est syntaxiquement invalide. Vous auriez besoin d'écrire:

bar1 = if foo1=14
  foo1*3
end
#=> 42

bar2 = foo2*3 if foo2=14
#=> NameError: undefined local variable or method `foo2' for main:Object


5 commentaires

AVERTISSEMENT: trouvé = sous condition, devrait être ==


@ Jonasefström Oui, il y a aussi ça. Mais le problème reste. C'est (je trouve personnellement et dans d'autres Code) commun dans Ruby pour utiliser la mission dans des conditionnels. si utilisateur = user.find (42) puis ... fin . Malheureusement, les heuristiques pour les variables locales ne fonctionnent pas lorsque la cession est dans un conditionnel de fuite unique.


@Phrogz, j'essaie de comprendre pourquoi la mission dans le conditionnel de fuite échoue. Où puis-je en savoir plus?


@Leito Le problème est que l'interprète de Ruby utilise une heuristique pour décider si un nom non qualifié non qualifié est une variable locale ou un appel de méthode, car pour foo = bar la barre pourrait être une variable locale ou un appel de méthode sans arguments. Si je comprends bien, la heuristique est basée sur la manière dont le nom est utilisé la première fois qu'il est vu lexiquement dans le code source. Dans le cas problématique, il décide que FOO2 est un appel de méthode au lieu d'une variable locale et est supposée être telle de ce point en avant.


@Leito, par exemple, cet horrible hack facilite le fonctionnement: bar = (foo || = 0) && (foo * 3) Si FOO = 14 Parce que la première fois qu'il voit foo Il sait qu'il doit être une variable locale et non un appel de méthode. Alternativement, il suffit de mettre foo = nil sur la ligne avant de le résoudre également.



2
votes

Vous pouvez utiliser soit mais si vous mettez d'abord l'instruction IF, vous devrez fermer la condition avec une "fin".

if 1==1 
   do_something(with params)
end


0 commentaires

1
votes

Les feuilles suivantes foo comme nul. xxx

ceci est parce que Ruby crée une variable foo et l'attribue à nil quand il lit (analyse, je pense) le foo = true bit, puis quand il se lit (exécutant, je pense) le sauf si défini? (FOO) , il est indiqué que < Code> FOO est défini (c'est défini comme nul) et n'exécute donc pas le foo = true partie.

Si vous l'avez fait < Pré> xxx

alors vous obtiendriez foo assigné à true.

J'ai ajouté ceci à Quels sont les rubis gotchas un débutant devraient être avertis? , parce que Quelqu'un a confondu à ce sujet ici .

Donc oui, dans certaines circonstances, cela peut compter.


0 commentaires