2010-12-21 8 views
6

Lo siento si esto es una pregunta estúpida, pero yo soy un chico de C# tientas su camino alrededor de rubí ..¿Importa si una declaración condicional aparece antes o después de la expresión?

en rubí Me he dado cuenta que mucha gente hacer esto:

do_something(with params) if 1 = 1 

¿Hay alguna diferencia (incluso leve) entre eso y esto:

if 1 = 1 do_something(with params) 

o es lo mismo escrito para una mayor claridad?

+0

Es principalmente estilístico. Cuando trato con una sola línea de código, uso el condicional final ya que parece tener más sentido conversacional. Dado que un gran componente del software de escritura lo hace sostenible, intento escribirlo de una manera que permita que se deslice fácilmente en el cerebro. Algunos libros recomiendan usar un bloque o envolver condicional 'if (blah) ... algún código ... end' solamente, argumentando que es mejor para la futura expansión del código. Si necesitamos agregar algo, el 'final' de cierre ya está allí. Encuentro que es muy fácil con mis poderes de vim para solucionarlo, así que utilizo una sola línea en su mayoría. –

Respuesta

2

Es azúcar sintáctica ... lo que nos permite escribir código de una manera que es más fácil de leer.

http://rubylearning.com/satishtalim/ruby_syntactic_sugar.html

Nota: para @Phrogz, los siguientes no son los mismos! ¡Asegúrese de no intentar asignar un valor a la variable en lugar de comparar una variable con un valor! Además, como menciona Phrogz, el orden de asignación de variables hace una gran diferencia ... ¡mira @Phrogz para más detalles!

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

fuego hasta irb y ejecutar su código y usted aprenderá:

  • 1 = 1 es un error de sintaxis, el cambio a 1 == 1.
  • No puede haber una expresión directamente después de if 1==1, deberá agregar : o then y cerrar con end.

El final if solo debería usarse para expresiones individuales y no puede agregar un else. Se llaman modificadores de extracto y son solo azúcar sintáctico para una mejor legibilidad. No estoy totalmente en contra de ellos, pero les recomiendo usarlos con moderación.

6

El último no es sintácticamente válido. Debería escribir:

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

Condicionales de línea única siempre deben seguir. Y sí, hay una diferencia. Probar estos:

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

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

En este último, Ruby ve la asignación después de la referencia y así trata a foo2 como un método en lugar de una variable local. Esto sólo es un problema cuando:

  • Está utilizando intencionadamente asignación (no probar por la igualdad) en una condicional y
  • Esta es la primera vez (en términos de orden de aparición) que esta variable ha sido asignado en la mira.
+0

'advertencia: found = en condicional, debería ser ==' –

+0

@ JonasElfström Sí, también está eso. Pero el problema permanece. Es (encuentro personalmente y en otros códigos) común en Ruby usar asignación en condicionales. 'if user = User.find (42) then ... end'. Lamentablemente, las heurísticas para las variables locales no funcionan cuando la asignación está en una línea condicional final. – Phrogz

+0

@Phrogz, intento entender por qué falla la asignación en el condicional final. ¿Dónde puedo leer más al respecto? – Leito

2

Puede usar cualquiera de las dos opciones, pero si coloca primero la sentencia if, deberá cerrar la condición con un 'final'.

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

Lo siguiente deja foo como nil.

foo = true unless defined?(foo) #Leaves foo as nil 

Esto se debe a Rubí crea una variable foo y lo asigna a cero cuando se lee (análisis, creo) el bit foo = true, y luego, cuando se lee (ejecución, creo) la unless defined?(foo), se dice que foo está definido (se define como nulo) y, por lo tanto, no ejecuta la parte foo = true.

Si lo hizo

unless defined?(foo) 
    foo = true 
end 

entonces se obtendría foo assinged true.

He añadido esto a What are the Ruby Gotchas a newbie should be warned about?, porque alguien ha confundido al respecto here.

Así que sí, en algunas circunstancias puede ser importante.

Cuestiones relacionadas