unless switch nombre for example completo ruby

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.