Ruby에서 "and"와 &&의 차이점은 무엇입니까?


답변:


349

and우선 순위&&낮지 만 동일 합니다. 둘 다 단락 평가를 사용 합니다.

경고 : and우선 순위가 낮 =으므로 일반적으로 피하는 것이 and좋습니다. and사용되어야 할 경우의 예 는 Rails Guide에서 " Double Render 오류 방지 "에 있습니다.


50
하나가 일반적으로 사용하도록 지정하는 것이 좋습니다 것 &&동안, and아주 특별한 경우에만 사용되어야한다.
Marc-André Lafortune


17
앤드류 마샬의 링크에서 : "생각하는 또 다른 방법에 대해 and반대의 같다 if문 수정 : next if widget = widgets.pop되고 widget = widgets.pop and next그 퍼팅의 좋은 방법, 정말 그것을했다."내 머리에 "클릭 (그리고. or반대의처럼 unless수정.)
GMA

1
이 답변을 tadman의 답변 세부 정보와 결합하면 전체 그림을 얻을 수 있습니다.
sargas

5
Avdi는 사용시기와 &&에 대한 정보를 업데이트했습니다. 기본적으로 우선 순위가 낮아 제어 흐름에 'and'및 'or'를 사용하십시오. devblog.avdi.org/2014/08/26/…
EricC

238

실제적인 차이점은 구속력이며, 준비되지 않은 경우 특이한 행동을 유발할 수 있습니다.

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

같은 기능이 ||및에 적용 or됩니다.


2
a = foo and bar 그리고 (a = foo ) && bar 그 증명 and보다 낮은 우선 순위를가집니다 &&.
sargas

나는 그것을 얻지 못한다 : "foo와 bar"는 무엇을 반환 하는가?
BKSpurgeon

a = foo and bar와 같습니다 (a = :foo) and nil. 대입이 논리적으로 true 값 ( :foo)을 반환하므로 두 번째 부분이 평가되고 실패하면을 반환 nil합니다.
tadman

61

루비 스타일 가이드는 내가 할 수있는 것보다 더 잘 말한다 :

&& / || 사용 부울 식 및 / 또는 제어 흐름. (엄지 규칙 : 외부 괄호를 사용해야하는 경우 잘못된 연산자를 사용하고 있습니다.)

# boolean expression
if some_condition && some_other_condition
  do_something
end

# control flow
document.saved? or document.save!

53
실제로 가이드는 이제and하거나 or완전히 피하 라고 지시 하며, 요점을 가질 수 있습니다. 종종 제어 흐름에서의 사용은 더 분명 작성 할 수 if/ unless사업자 (예 : 어쨌든 document.save! unless document.saved?)
Yarin

트롤링을하지 않은 경우를 대비하여 @akostadinov : Ruby 스타일 가이드는 Ruby 제작자가 작성하지 않았습니다. 루비는 마쓰모토 유키히로와 다른 사람들에 의해 만들어졌으며, 루비 스타일 가이드는 주로 Bozhidar Batsov에 의해 만들어졌습니다.
Andrew Grimm

2
@AndrewGrimm, 감사합니다. 트롤링에 대해 죄송하지만 루비 현실의 일부 측면과 진지하게 혼동됩니다. 한 가지 확실한 점은 모든 루비 프로젝트는 코드베이스를 유지 관리하기 위해 엄격한 스타일 정책이 필요하다는 것입니다.
akostadinov

37

||&&결합하면 프로그래밍 언어에서 부울 연산자에서 기대하는 우선 순위가 ( &&매우 강하고 ||약간 덜 강하다).

andor낮은 우선 순위를 가지고있다.

예를 들어, 달리 ||, or보다 낮은 우선 순위를가집니다 =:

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

이와 달리 &&, and또한보다 낮은 우선 순위를가집니다 =:

> a = true && false
 => false 
> a
 => false 
> a = true and false
 => false 
> a
 => true 

더 달리 무엇 &&||, and그리고 or바인딩과 동일한 우선 순위 :

> !puts(1) || !puts(2) && !puts(3)
1
 => true
> !puts(1) or !puts(2) and !puts(3)
1
3
 => true 
> !puts(1) or (!puts(2) and !puts(3))
1
 => true

약하게 바인딩 and되며 or제어 흐름 목적에 유용 할 수 있습니다 . http://devblog.avdi.org/2010/08/02/using-and-and-and-or-in-ruby/를 참조 하십시오 .


2
"달리 ||, or보다 낮은 우선 순위가 ="... 지금은 덕분에 더 의미가 있습니다!
Steph Sharp

18

and보다 우선 순위가 낮습니다 &&.

그러나 가정하지 않은 사용자의 경우 할당 연산자와 같이 우선 순위가 다른 연산자와 함께 사용하면 문제가 발생할 수 있습니다.

def happy?() true; end
def 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

1
고맙지 만 "&"의 우선 순위는 "&&"와 어떻게 다릅니 까?
BKSpurgeon

2
@BKSpurgeon Ruby에서 정렬 된 연산자 우선 순위 목록은 여기 를 참조 하십시오 .
thutt

5

and우선 순위가 낮으며 주로 다음과 같은 제어 흐름 수정 자로 사용합니다 if.

next if widget = widgets.pop

된다

widget = widgets.pop and next

의 경우 or:

raise "Not ready!" unless ready_to_rock?

된다

ready_to_rock? or raise "Not ready!"

내가 사용하는 것을 선호 if하지만 and때문에, if더 이해할 수 있습니다 난 그냥 무시 있도록 and하고 or.

자세한 내용은 " Ruby에서"및 "및"또는 "사용 "을 참조하십시오.


0

이것이 Ruby 의도인지 또는 이것이 버그인지는 모르지만 아래 코드를 사용해보십시오. 이 코드는 Ruby 버전 2.5.1에서 실행되었으며 Linux 시스템에서 실행되었습니다.

puts 1 > -1 and 257 < 256
# => false

puts 1 > -1 && 257 < 256
# => true

1
@JakubArnold Sarcasm은 결코 도움이되지 않습니다. 때때로 예가 있습니다.
BobRodes 2019

@BobRodes 그것은 풍자적이지 않았습니다. 7 개의 답변이 있으며 그 중 6 개에 이미 예가 있습니다.
야쿱 아놀드

1
@JakubArnold이 예제가 여전히 유용하다는 것을 알았습니다.
BobRodes

이상한 결과가 나옵니다. v1 = 참 및 거짓 p v1 # => app.rb : 참, IRB : 거짓 v2 = 참 && 거짓 p v2 # => app.rb : 거짓, IRB : 거짓 1> -1 && 257 <256 # => app.rb : 거짓, IRB : 거짓
Rich_F
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.