Diferença entre “ou” e || em Ruby?

Qual a diferença entre o or e || operadores em Ruby? Ou é apenas preferência?

   

É uma questão de precedência do operador.

|| tem uma precedência maior que or .

Assim, entre os dois você tem outros operadores, incluindo ternário ( ? : 🙂 E atribuição ( = ), então qual deles você escolhe pode afetar o resultado das declarações.

Aqui está uma tabela de precedência do operador Ruby .

Veja esta questão para outro exemplo usando and / and && .

Além disso, esteja ciente de algumas coisas desagradáveis ​​que poderiam acontecer:

 a = false || true => true a => true a = false or true => true a => false 

As duas instruções anteriores são avaliadas como true , mas a segunda define a como false porque = precedência é menor que || mas maior que or .

Como os outros já explicaram, a única diferença é a precedência. No entanto, gostaria de salientar que existem duas diferenças entre os dois:

  1. and , or e not tem precedência muito menor que && , || e !
  2. and e or tem a mesma precedência, enquanto && tem precedência maior que ||

Em geral, é bom estilo para evitar o uso de and , or e not e usar && , || e ! em vez de. (Os desenvolvedores principais do Rails, por exemplo, rejeitam patches que usam os formulários de palavra-chave em vez dos formulários do operador.)

A razão pela qual eles existem, não é para fórmulas booleanas, mas para o stream de controle. Eles entraram no Ruby através do bem conhecido do_this or do_that idiom do do_this or do_that , onde do_this retorna false ou nil se houver um erro e somente então o do_that é executado em vez disso. (Analogous, há também o do_this and then_do_that idiom.)

Exemplos:

 download_file_via_fast_connection or download_via_slow_connection download_latest_currency_rates and store_them_in_the_cache 

Às vezes, isso pode tornar o stream de controle um pouco mais fluente do que usar if ou unless .

É fácil entender por que, nesse caso, os operadores têm a precedência “errada” (ou seja, idêntica): eles nunca aparecem juntos na mesma expressão. E quando eles aparecem juntos, você geralmente quer que eles sejam avaliados simplesmente da esquerda para a direita.

e / ou são para stream de controle.

Ruby não permitirá isso como syntax válida:

 false || raise "Error" 

No entanto, isso é válido:

 false or raise "Error" 

Você pode fazer o primeiro trabalho, com (), mas usando or é o método correto.

 false || (raise "Error") 
 puts false or true 

impressões: falso

 puts false || true 

impressões: true

Yoda: Cuidado você deve ser.

A maneira como eu uso esses operadores:

||, && são para lógica booleana. or, and são para stream de controle. Por exemplo

do_smth if may_be || may_be do_smth if may_be || may_be – nós avaliamos a condição aqui

do_smth or do_smth_else – definimos o stream de trabalho, que é equivalente a do_smth_else unless do_smth

para dar um exemplo simples:

> puts "a" && "b" b

> puts 'a' and 'b' a

Um idioma bem conhecido no Rails é render and return . É um atalho para dizer return if render , enquanto render && return não funcionará (veja a documentação do Rails)

ou NÃO é o mesmo que ||

Use apenas || operador em vez de ou operador.

Razões:

  • ou operador tem precedência menor que ||
  • ou ter precedência menor que = operador de atribuição
  • e e ou tem a mesma precedência, enquanto && tem precedência maior que ||

Ambos “ou” e “||” avalie para verdadeiro se um dos operandos for verdadeiro. Eles avaliam seu segundo operando somente se o primeiro for falso.

Tal como acontece com “e”, a única diferença entre “ou” e “||” é a sua precedência.

Apenas para tornar a vida interessante, “and” e “or” têm a mesma precedência, enquanto “&&” tem uma precedência maior que “||”.

Só para acrescentar à resposta do mopoke, é também uma questão de semântica. or é considerado uma boa prática porque lê muito melhor que || .