2011-04-05 3 views
1

가끔 if/unless 수식자를 사용하려고하지만 조건부로 실행되는 부분에 조건 내에 정의 될 로컬 변수가 포함되는 경우가 있습니다. 예를 들어, 수정 자 대 및/또는

a = [1, 2, 3] 
n = 3*(x**2) + 4*x + 5 if x = a[2] 
m = 6*(y**2) + 7*y + 8 unless (y = a[0]).zero? 

는 구문 분석 오류 x 때문에, yif/ unless 수정하기 전에 읽기를 제공 할 것입니다. 이다

x = a[2] and n = 3*(x**2) + 4*x + 5 
(y = a[0]).zero? or m = 6*(y**2) + 7*y + 8 

사실 게다가 그것이 오류가 발생하지 않습니다 :이를 방지하기 위해, 나는 꽤 많은 (적어도 나를 위해) 일반적인 and 대신 ifor를 사용하는 대신에 unless 생각 거기에 어떤 차이가 있습니까? 이 일에 어떤 부작용이 있습니까? 그리고 더 좋은 방법이 있습니까?

+1

당신이 실제로 말하는 것은 특정 언어에 대한 일반적인 코딩 스타일입니다. Perl에서는'if' 테스트와 짧은 부울 테스트에서 할당을 수행하는 것이 일반적이며, 일부 연산에서는'and' 또는'or' 접합이 사용됩니다. Perl 프로그램이 종종 회선 잡음처럼 보이는 이유 중 일부일 수도 있습니다. :-) Ruby에서는 간결함으로 인해 많은 것을 얻지 못했기 때문에 우리는 그렇게하지 않는 경향이 있으며 유지 보수 문제로 이어질 수있는 것이 무엇인지 명확하지는 않습니다. 나는 Perl 개발자들이 그런 식으로 글을 쓰지 않겠다는 권고안을 보았지만 어떤 사람들은 사나이다고 생각하고 다른 사람들은 오래된 습관과 싸우고 있다고 생각한다. –

+1

관련이 있지만 http://stackoverflow.com/questions/2291646/in-ruby-why-wont-foo-true-unless-definedfoo-make-the-assignment –

답변

2

대안을 찾고있다 (그리고 사용했다) 무엇을 것 같다 :

if x=a[2] 
    n = 3*(x**2) + 4*x + 5 
end 

if x=a[2] then n = 3*(x**2) + 4*x + 5 end 

x=nil 
n = 3*(x**2) + 4*x + 5 if x=a[2] 
+0

두 번째 옵션이 그리 나쁘지 않을 수도 있다는 것을 깨달았습니다. – sawa

+0

첫 번째 두 변수는 변수 할당을 먼저 배치하는 추가 된 값을 가지며, 변수 할당을 사용하는 명령문보다 먼저 읽혀집니다. 나는 가장 일반적으로 첫 번째를 만난다. 나는 세 번째를 좋아하지 않는다. –

0

논리적 또는 측면 중 하나가 true로 평가되면 true를 반환 ...

당신은 orunless 선이 or 라인은 항상 m = 6*(y**2) + 7*y + 8 때문에 true로 평가하는, 이 (수 동일하다고 확신 사실이다)?

편집 : - 내가 잘못 this doc 살펴보고했다

아니이 문제가 발생했을 때 내가 선택한 것

+0

루비의 '또는'논리적이 아닙니다. 또는. 첫 번째 비 -nil 또는 -false 값 (또는 마지막 값)을 반환합니다. –

0

난 그냥

if x = something then f(x) end   (1) 
사이에 차이가 있음을 깨달았

something false의 값을 취한다
x = something and f(x)     (2) 

. 이 경우 (1)은 nil을 반환하고 (2)는 false을 반환합니다.

관련 문제