2015-01-22 2 views
7

두 시험이다 :우선 순위 여기

if [1,2,3,4].include? 2 && nil.nil? 
    puts :hello 
end 
#=> 

if [1,2,3,4].include?(2) && nil.nil? 
    puts :hello 
end 
#=> hello 

&& 논리적으로의 ands 2 && nil.nil? 그것 때문에 메소드 인수보다 높은 우선 순위를 가지고 있음을 알려줍니다 그것은 진실이고 이것을 인수로 포함시키는 것입니다.

그러나,이 테스트가 :

if [1,2,3,4].include? 2 and nil.nil? 
    puts :hello 
end 
#=> hello 

그래서 이것이 나에게 그 메소드 인자와 말하는 'and은'우선 순위가 동일 (또는 메소드의 인수는 'and'보다 높은)는 2를 통과하기 때문에 포함? 처리하기 전에 '및'.

참고 : &&and의 우선 순위가 다릅니다. 문제는 이것에 관한 것이 아니라 and 또는 or에 대해서 루비 메서드에 대한 인수와 관련됩니다.

나는 이것을 확인하는 문서를 찾을 수 없습니다. 인스턴스의 경우 메서드 인수에 대해서는 전혀 언급하지 않았습니다. http://phrogz.net/programmingruby/language.html#table_18.4 또는 http://romhack.wikia.com/wiki/Ruby_operators입니다.

누구든지이 동작을 설명 할 수 있습니까? 즉 루비는 메소드 대 프로세스 연산자에 인수로서 값을 전달하는 것을 어떻게 알고 있습니까?

+1

구문 분석의 일부로'및'과'&'는 다른 우선 순위를 갖습니다. 일단 괄호가없는 메소드를 호출하면 꽤 빠르게 복잡해 지지만, 무언가가 첫 공백 인 iirc의 인수라고 생각하지 않게 될 것입니다. 또는 다른 방법. –

+4

이러한 혼란을 피할 수있는 나의 경험 법칙 : 필요없는 경우에도 인수를 사용하여 메서드를 호출 할 때 괄호를 포함하고'and' 또는'or'를 사용하지 마십시오. 루비 사람들은 괄호에 대한 병리학 적 두려움을 가지고있는 경향이 있습니다. 그래서 그들을 사용하면 더러운 표정이 많이 들지만 걱정하지 않습니다.시는 혼란스러운 시도보다는 읽을 수 있습니다. –

+0

+ 1. Ruby의 이러한 동작이 Perl을 모델로하는 한, Perl의 연산자 우선 순위 차트가 도움이 될 수 있습니다. http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity를 참조하십시오. 이 차트에는 "왼쪽"과 "오른쪽"우선 순위가 다른 함수 호출이 포함됩니다. (예를 들어'1 && foo 2 && 3'는'1 && (foo (2 && 3))'를 의미합니다. - 함수 호출은 첫 번째'&&'보다 우선 순위가 높지만 두 번째'&&' 물론 루비에게는 차트가 원격으로 권한이 부여되지 않는다. – ruakh

답변

0

메소드 인수 우선 순위에 대한 문서는 본 적이 없지만 메소드 인수를 볼 때 정신적으로 공백을 제거하고 가능한 한 공백을 제거하고 동일한 표현식을 사용하는 것이 좋습니다. 이것은 일반적으로 나에게 우선 제공 :

[1,2,3,4].include? 2&&nil.nil?이 같은 표현을하지만, 따라서 [1,2,3,4].include? 2 and nil.nil?과의 공백을 제거 할 수없는, 우선 순위가에 남아있는 바로 ... 즉, 메서드 인수는 2입니다.

어쨌든 더 좋은 질문은이 지구상에서 왜 이런 문장을 써야할까요?

생략 방법 괄호는 코드를 읽기 쉽도록 만 유용합니다. 그러나 귀하의 진술은 거의 읽을 수 없으며 코드를 잠시 멈추고 그가 생각한 것보다 더 많이 생각합니다. 이런 코드를 검토한다면 가독성이 떨어 지므로 코드 검토에 실패 할 것입니다.

사실 많은 스타일 가이드에서는 인수가있는 대부분의 메서드를 괄호로 묶어야한다고 명시하고 있습니다 (이 단어도 마찬가지입니다). Ruby style guide

+1

나는 당신에 동의합니다. 이것은 코드 리뷰에서 였고 내가 그것에 대해 물어 보았을 때 테스트 해보고이 동작을 발견했으며 메서드 인수의 우선 순위에 대해 이해하기를 원했습니다. 나는'과'를 사용하지 않고 '&&'와 같은 코드가 작동하지 않는다는 것을 알았고 왜'와'와 함께 작동하는지 궁금했습니다. – jshort

+0

네, 생산 과정에서이 코드를 사용하는 것은 정신적 인 것이지만 재미있는 토론을하게됩니다. – maniacalrobot

1

당신이 &&and는, 다음과 같은 예를 들어, 그러나 설명 다른 우선 순위가 말했듯이 : Difference between "and" and && in Ruby?

:

if [1,2,3,4].include? 2 and nil.nil? 
    puts :hello 
end 
#=> hello 

을 여기 읽을 수로 and의 결합 strenght 예를 들어

이것은 기본적으로 2 and nil.nil?이 nil로 평가되지만이 예에서 볼 수 있듯이 2를 반환한다고 설명합니다.

foo = :foo 
bar = nil 

a = foo and bar 
# => nil 
a 
# => :foo 

a = foo && bar 
# => nil 
a 
# => nil