2012-03-30 5 views
1

메서드 매개 변수가 괄호로 묶인 것을 좋아합니다. 이것은 파스칼 향수입니다. 코드를 정리할 때 매개 변수가없는 메서드 매개 변수를 찾으면 즉시이를 묶습니다. 문서에 따라 구문이 정상적으로 보였지만 오늘 작업 코드에서 오류가 발생했습니다.루비 Kernel.raise 메서드는 매개 변수를 괄호로 묶을 때 오류가 발생합니다

(Object) raise(exception[, string [, array]]) 

이 모든 작업은 다음과 같습니다 :

> raise TypeError 
TypeError: TypeError 

> raise (TypeError) 
TypeError: TypeError 

> raise "Error message" 
RuntimeError: Error message 

> raise ("Error message") 
RuntimeError: Error message 

그러나 다음이 발생 구문 오류가 동봉 된 버전 :

> raise TypeError, "Error message" 
TypeError: Error message 

> raise (TypeError, "Error message") 
SyntaxError: unexpected ')', expecting $end 

I

Kernel.raise의 문서는이 형식은 그것을없이 살 수있다, 나는 단지 이것이 왜 오류로 끝나는 지 알고 싶다.

답변

5

아마도 관용적 인 루비에서는 메서드의 끝과 인수 목록의 사이에 괄호 안에 공백을 삽입하지 않을 것입니다. Some 스타일 가이드 explicitly forbid it.

실용적인 이유가 있습니다.

1.9.2-p290 > def concat(a, b) 
1.9.2-p290 > a + b 
1.9.2-p290 > end 

1.9.2-p290 > concat 'foo', 'bar' 
=> "foobar" 
1.9.2-p290 > concat('foo', 'bar') 
=> "foobar" 
1.9.2-p290 > concat ('foo', 'bar') 
SyntaxError: (irb):27: syntax error, unexpected ',', expecting ')' 

당신은 그냥 Kernel.raise, 어떤 방법이 방법을 호출 오류가 발생할 수 있습니다.

저는 Ruby 내부에 익숙하지 않지만, 공간이 인수 목록보다 앞에 나오면 Ruby는 "no-parens"스타일을 기대하고 있다고 생각합니다. 물론 그래서이 작동합니다

1.9.2-p290 :035 > concat ("bar"), ("foo") 
=> "barfoo" 

은 아마도 루비 방법에 결과를 전달하기 전에 각 괄호 표현의 내용을 평가하기 위해 노력하고있다. 나는 raise (TypeError, "Error message")이라고 쓰면 루비가 단지 TypeError, "Error message"을 평가할 것을 요구하고 있는데, 물론 실패한다.

3

괄호는 루비에서 표현 그룹화 및 우선 순위 재정의에 사용됩니다. 그래서, 때 당신은 당신이 표현 bar, baz을 평가 한 결과 단일 인수로 메시지 :foo를 보내는

foo (bar, baz) 

을 말한다. bar, baz은 유효한 표현식이 아니므로 SyntaxError이 표시됩니다.

foo (bar) 

작품, bar가 유효한 표현이기 때문이다.

foo (if bar then baz else quux end) 

도 작동합니다.

루비는 그룹화를 표현하지만, 메시지 전송과 함께 여러 인수를 전달하는 괄호를 해석하려면

은 여는 괄호 직접 메시지 선택기를 수행 할 필요가 :

foo(bar, baz) 

이 함께 할 수 없다 Kernel#raise, BTW.Ruby에서 메시지 보내기의 구문을 변경할 수는 없습니다 (실제로는 을 Ruby에서 구문으로 변경할 수 없음). 따라서 Kernel#raise에 해당하는 것이 다른 모든 방법에도 해당되어야합니다.