for - ruby switch nombre completo
¿Cuál es la diferencia entre las declaraciones "if" con "then" al final? (5)
¿Cuál es la diferencia entre estas dos declaraciones de Ruby if
cuando ponemos un then
al final de la declaración if
?
if(val == "hi") then
something.meth("hello")
else
something.meth("right")
end
y
if(val == "hi")
something.meth("hello")
else
something.meth("right")
end
Aquí hay un consejo rápido que no está directamente relacionado con su pregunta: en Ruby, no existe una declaración if
. De hecho, en Ruby, no hay declaraciones en absoluto . Todo es una expresión. Una expresión if
devuelve el valor de la última expresión que se evaluó en la rama que se tomó.
Entonces, no hay necesidad de escribir
if condition
foo(something)
else
foo(something_else)
end
Esto sería mejor escrito como
foo(
if condition
something
else
something_else
end
)
O como un trazador de líneas
foo(if condition then something else something_else end)
En tu ejemplo:
something.meth(if val == ''hi'' then ''hello'' else ''right'' end)
Nota: Ruby también tiene un operador ternario ( condition ? then_branch : else_branch
) pero eso es completamente innecesario y debe evitarse. La única razón por la cual el operador ternario es necesario en idiomas como C es porque en C if
es una declaración y por lo tanto no puede devolver un valor. Necesita el operador ternario, porque es una expresión y es la única forma de devolver un valor desde un condicional. Pero en Ruby, if
ya es una expresión, entonces realmente no hay necesidad de un operador ternario.
El único momento que me gusta usar en una línea múltiple if/else
(sí, sé que no es obligatorio) es cuando hay varias condiciones para el if
, así:
if some_thing? ||
(some_other_thing? && this_thing_too?) ||
or_even_this_thing_right_here?
then
some_record.do_something_awesome!
end
Encuentro que es mucho más legible que cualquiera de estas opciones (completamente válidas):
if some_thing? || (some_other_thing? && this_thing_too?) || or_even_this_thing_right_here?
some_record.do_something_awesome!
end
# or
if some_thing? ||
(some_other_thing? && this_thing_too?) ||
or_even_this_thing_right_here?
some_record.do_something_awesome!
end
Porque proporciona una delineación visual entre la condición del if
y el bloque para ejecutar si la condición se evalúa como true
.
No hay diferencia en absoluto.
Y, para su información, su código puede ser optimizado para
something.meth( val == ''hi'' ? ''hello'' : ''right'' )
then
hay un delimitador para ayudar a Ruby a identificar la condición y la parte verdadera de la expresión.
if
condición es verdadera-parte else
falsa-parte end
then
es opcional a menos que desee escribir una expresión if
en una línea. Para un if-else-end que abarca múltiples líneas, la nueva línea actúa como un delimitador para dividir el condicional de la parte verdadera
# can''t use newline as delimiter, need keywords
puts if (val == 1) then ''1'' else ''Not 1'' end
# can use newline as delimiter
puts if (val == 1)
''1''
else
''Not 1''
end
then
solo se requiere si desea escribir la expresión if
en una línea:
if val == "hi" then something.meth("hello")
else something.meth("right")
end
Los corchetes en su ejemplo no son significativos, puede omitirlos en cualquier caso.
Vea el Libro de Pico para más detalles.