2010-02-12 4 views
5

레일 애플리케이션에 if 문이 있습니다. 기본적인 "if true and false"체크를해야합니다. 표현식은 다음과 같이 정의됩니다.루비 : '&&! (expr)'이 아닌 경우 '와'는 왜 작동합니까?

ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set') 

if를 if로 설정하면 if가 트리거되지 않습니다. 콘솔에서 그 식을 실행하면 나는 틀린 값을 얻습니다. 내가 읽을 수있는 표현을 수정하면 이제

:

ActiveRecord::Base.connection.tables.include? 'settings' and not Settings.setting_is_set?('defaults_set') 

예상대로 그것은 true를 반환하고,이 블록의 실행합니다.

왜 'expression & &! expression'이 'expression and not expression'처럼 작동하지 않는 이유는 무엇입니까? 내 이해는 & &이고! 거의와 직접적으로 일치하지 않아야한다.

무엇이 여기에 있습니까?

+0

이것은 주로 연산자 우선 순위 때문입니다. 저는 PHP와 파이썬에서이 점을 분명히하고 있습니다 만, Ruby는 아닙니다. 아마 Ruby를 잘 아는 사람이라면 Ruby에서 어떻게 작동하는지 설명 할 것입니다. – JAL

+0

이것은 http://StackOverflow.Com/questions/2083112/ –

답변

6

왜냐하면 사용하기 때문에 && 루비는 문자열 전체를 include으로 전달되는 하나의 인수로 해석합니다. 'settings' 주위에 괄호를 넣어 첫 번째 문은 잘 작동합니다 :

ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set') 
# => false 

ActiveRecord::Base.connection.tables.include?('settings') && !Settings.setting_is_set?('defaults_set') 
# => true 

을 어떻게 든, 당신이 and not를 사용할 때 두 번째 부분은 include에 전달하고 호출이 성공되는 내용의 일부가 아닌 것을 알고있다.

+7

의 정확한 복제이며'and'는'&&'보다 낮은 우선 순위를가집니다. 이것은 일반적인 루비 잡았다 : http://stackoverflow.com/questions/372652/what-are-the-ruby-gotchas-a-newbie-should-be-warned-about –

+0

이것은 트릭을했다. 고맙습니다. –

+0

절대로 &&/| 만 사용하지 않습니다. 대부분의 언어에서 이러한 구조가 우선 순위가 높을 것으로 기대합니다. 그리고/또는하지 말라. – Shadowfirebird

0

‘not’은 제어 연산자이며 !은 논리 연산자입니다. 차이점은 명령을 평가할 때 'not'가 우선 순위가 낮습니다. 논리 표현식을 사용할 때는 !을 사용하십시오.

관련 문제