Carlos Brando

Nome do Jogo

and ou &&, qual devo usar?

217551252_423459c5c5.jpg

Tanto no Ruby como no Rails você sempre vai encontrar muitas redundâncias. Dois métodos que fazem a mesma coisa ou duas formas diferentes de escrever o mesmo código. E na maioria dos casos, você vai até analisar para ver se não existe uma pequena diferença, mas vai descobrir, que não, realmente não existe nenhuma diferença, são redundâncias mesmo.

Algumas vezes isto complica, em outras ajuda. Mas quando se tem duas opções para fazer a mesma coisa, qual usar?

Há alguns dias atrás eu estava me perguntando, o que é melhor usar: a palavra chave and ou os símbolos && e &?

Na verdade, depende de quem está programando, porque as duas opções tem o mesmo resultado. Claro que os símbolos && e &, embora apresentem o mesmo resultado, tem uma leve diferença. Basicamente o && é mais inteligente que o &, porque se a primeira afirmação falhar, ele nem verifica a segunda, mais ou menos assim:

def metodo_a
  puts "metodo a"
  false
end

def metodo_b
  puts "metodo b"
  true
end

irb(main):011:0> metodo_a && metodo_b
metodo a
=> false

O & já é diferente, pois ele sempre vai verificar as duas condições independente do resultado da primeira.

irb(main):012:0> metodo_a & metodo_b
metodo a
metodo b
=> false

OK, mas e aí? Uso o && ou a palavra-chave and nos meus códigos? Tanto faz, é uma pura questão de estética. Mas para ajudar a tomar uma decisão, dê uma olhada na documentação do repositório do Rails (clique aqui).

Como você pode ver existe algumas recomendações para quem vai criar ou corrigir algo no código do Rails, são:

  • Na tabulação use dois espaços, não tab
  • Não use and ou or para testar booleanos, sempre use && ou ||
  • MyClass.my_method(my_arg) – não my_method( my_arg ) ou my_method my_arg
  • Siga as convenções que você encontrar no código em volta.

Eu optei por seguir as convenções do Rails.

[ATUALIZAÇÃO]

Conversando com o Akita, fizemos alguns testes e resolvi mostrar o porque da convensão de se usar && no Rails e não and.

Veja este exemplo:

>> x = true and false
=> false

Qual o valor da variável x? Tem certeza?

>> x
=> true

Acontece que o operador = tem prioridade quanto ao and, no fim é como se a expressão fosse assim:

(x = true) and false

Exatamente para evitar estes problemas é melhor usar o &&.

Comments