AVISO: andainda tem precedência mais baixa do que =você normalmente deseja evitar and. Um exemplo de quando anddeve ser usado pode ser encontrado no Guia do Rails, em " Evitando erros de renderização dupla ".
No link de Andrew Marshall: "Outra maneira de pensar andé como um ifmodificador de declaração invertida : next if widget = widgets.poptorna - se widget = widgets.pop and next. Essa é uma ótima maneira de colocar isso, realmente fez com que" clique "na minha cabeça. (E oré como um unlessmodificador invertido .)
GMA
1
Combine esta resposta com os detalhes da resposta de tadman e você terá uma visão geral.
sargas
5
Avdi atualizou sua opinião sobre quando usar e vs. Basicamente, use 'e' e 'ou' para o fluxo de controle devido à sua menor precedência. devblog.avdi.org/2014/08/26/…
EricC
238
A diferença prática é a força de ligação, que pode levar a um comportamento peculiar se você não estiver preparado para isso:
foo =:foo
bar =nil
a = foo and bar
# => nil
a
# => :foo
a = foo && bar
# => nil
a
# => nil
a =(foo and bar)# => nil
a
# => nil(a = foo)&& bar
# => nil
a
# => :foo
a = foo and bare(a = foo ) && bar prova que andtem precedência menor que &&.
Sargas
não entendi: o que "foo and bar" deve retornar?
precisa saber é o seguinte
a = foo and baré equivalente a (a = :foo) and nil. Como a atribuição retorna um valor logicamente verdadeiro ( :foo), a segunda parte avalia, o que falha, retornando nil.
Use && / || para expressões booleanas e / ou para controle de fluxo. (Regra básica: se você precisar usar parênteses externos, estará usando os operadores errados.)
@akostadinov, caso você não estivesse andando de um lado para o outro: o guia Ruby Style não foi escrito pelos criadores do Ruby. Ruby foi criado por Yukihiro Matsumoto e outros, enquanto o Ruby Style Guide foi principalmente por Bozhidar Batsov.
Andrew Grimm
2
@AndrewGrimm, obrigado, bom saber. Desculpe por trollar, mas estou sinceramente confuso com alguns aspectos da realidade do rubi. Uma coisa é certa - todo projeto ruby precisa de políticas rígidas de estilo para manter a base de código sustentável.
akostadinov 04/07/2014
37
||e &&vincule com a precedência que você espera dos operadores booleanos nas linguagens de programação ( &&é muito forte, ||é um pouco menos forte).
and e or têm menor precedência.
Por exemplo, ao contrário ||, ortem precedência mais baixa que =:
> a =false||true=>true> a
=>true> a =falseortrue=>true> a
=>false
Da mesma forma, ao contrário &&, andtambém tem precedência menor do que =:
> a =true&&false=>false> a
=>false> a =trueandfalse=>false> a
=>true
Além do mais, ao contrário &&e ||, ande orse ligam com a mesma precedência:
"ao contrário ||, ortem precedência menor que =" ... agora faz mais sentido, obrigado!
Steph Sharp
18
andtem precedência mais baixa que &&.
Mas para um usuário despretensioso, podem ocorrer problemas se ele for usado junto com outros operadores cuja precedência esteja entre, por exemplo, o operador de atribuição:
def happy?()true;enddef know_it?()true;end
todo = happy?&& know_it??"Clap your hands":"Do Nothing"
todo
# => "Clap your hands"
todo = happy?and know_it??"Clap your hands":"Do Nothing"
todo
# => true
Não sei se essa é a intenção do Ruby ou se é um bug, mas tente este código abaixo. Este código foi executado no Ruby versão 2.5.1 e estava em um sistema Linux.
or
e||
.Respostas:
and
é o mesmo que&&
mas com menor precedência . Ambos usam avaliação de curto-circuito .AVISO:
and
ainda tem precedência mais baixa do que=
você normalmente deseja evitarand
. Um exemplo de quandoand
deve ser usado pode ser encontrado no Guia do Rails, em " Evitando erros de renderização dupla ".fonte
&&
, enquantoand
deve ser usado apenas para casos muito específicos.and
é como umif
modificador de declaração invertida :next if widget = widgets.pop
torna - sewidget = widgets.pop and next
. Essa é uma ótima maneira de colocar isso, realmente fez com que" clique "na minha cabeça. (Eor
é como umunless
modificador invertido .)A diferença prática é a força de ligação, que pode levar a um comportamento peculiar se você não estiver preparado para isso:
A mesma coisa funciona para
||
eor
.fonte
a = foo and bar
e(a = foo ) && bar
prova queand
tem precedência menor que&&
.a = foo and bar
é equivalente a(a = :foo) and nil
. Como a atribuição retorna um valor logicamente verdadeiro (:foo
), a segunda parte avalia, o que falha, retornandonil
.O Ruby Style Guide diz que é melhor do que eu poderia:
fonte
and
/or
completamente, e eles podem ter razão . Muitas vezes, a sua utilização no controlo de fluxo pode ser mais obviamente escrito comif
/unless
operadores de qualquer forma (por exemplo,document.save! unless document.saved?
)||
e&&
vincule com a precedência que você espera dos operadores booleanos nas linguagens de programação (&&
é muito forte,||
é um pouco menos forte).and
eor
têm menor precedência.Por exemplo, ao contrário
||
,or
tem precedência mais baixa que=
:Da mesma forma, ao contrário
&&
,and
também tem precedência menor do que=
:Além do mais, ao contrário
&&
e||
,and
eor
se ligam com a mesma precedência:A ligação fraca
and
eor
pode ser útil para fins de controle de fluxo: consulte http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .fonte
||
,or
tem precedência menor que=
" ... agora faz mais sentido, obrigado!and
tem precedência mais baixa que&&
.Mas para um usuário despretensioso, podem ocorrer problemas se ele for usado junto com outros operadores cuja precedência esteja entre, por exemplo, o operador de atribuição:
fonte
and
tem precedência mais baixa, principalmente o usamos como um modificador de controle-fluxo, comoif
:torna-se
Para
or
:torna-se
Eu prefiro usar,
if
mas nãoand
, porqueif
é mais inteligível, então simplesmente ignoroand
eor
.Consulte " Usando" e "e" ou "em Ruby " para obter mais informações.
fonte
Não sei se essa é a intenção do Ruby ou se é um bug, mas tente este código abaixo. Este código foi executado no Ruby versão 2.5.1 e estava em um sistema Linux.
fonte