2010-12-21 4 views
6

이것은 어리석은 질문이라면 미안하지만 나는 루비를 둘러싼 자신의 길을 뒤적 거리는 C# 녀석이다 .. 루비에서조건문이 표현 앞이나 뒤에 오는 것이 중요합니까?

나는 많은 사람들이 이것을 알아 차린다.

do_something(with params) if 1 = 1 

은 차이가있다. 약간) 그 사이에 :

if 1 = 1 do_something(with params) 

또는 더 똑똑한 똑같은 건가요?

+0

대부분 스타일입니다. 한 줄의 코드를 다룰 때는 대화식으로 더 이해하기 쉬운 것으로 보이는 조건문을 사용합니다. 필기 소프트웨어의 큰 구성 요소가 유지 보수 가능하게 만들었 기 때문에 나는 그것을 뇌에 쉽게 밀어 넣을 수있는 방식으로 작성하려고합니다. 어떤 책은 블럭을 사용하거나'if (blah) ... some code ... end'라는 조건문을 래핑하여 코드의 미래 확장에 더 좋다고 주장한다. 뭔가 추가해야 할 경우 닫는'end'가 이미 있습니다. 나는 내 vim-powers가 그것을 해결하기에 충분히 쉬워서 싱글 라인을 주로 사용한다. –

답변

2

구문 상 설탕 ... 읽기 쉬운 방식으로 코드를 작성할 수 있습니다.

http://rubylearning.com/satishtalim/ruby_syntactic_sugar.html

참고 : @Phrogz를 들어, 다음은 동일하지 않습니다! 변수를 값과 비교하는 대신 변수에 값을 지정하려고하지 않았는지 확인하십시오! 또한 Phrogz가 언급 한 것처럼, 변수 할당의 순서는 큰 차이를 만듭니다 ... @Phrogz의 mor 세부 정보를보십시오!

if 1 = 1 then do_something(with params) end 
if 1 == 1 then do_something(with params) end 
4

화재 최대 irb과 코드를 실행하고 당신은 배울 것이다 :

  • 1 = 1 1 == 1로 변경, 구문 오류입니다.
  • if 1==1 다음에 직접 표현식을 사용할 수 없으면 : 또는 then을 추가하고 end으로 닫아야합니다.

꼬리말 if은 실제로 단일 표현식에만 사용해야하며 else을 추가 할 수 없습니다. 그것들은 문 수식어이라고하며 더 읽기 쉽도록 문법적인 설탕입니다. 나는 그들에게 완전히 반대하지는 않지만, 아껴서 사용하는 것을 권장합니다.

6

후자는 구문 적으로 유효하지 않습니다. 다음을 작성해야합니다.

if 1==1 then do_something(with params) end 

단일 행 조건문은 항상 따라야합니다. 예, 차이점은입니다. 이러한 해보세요 :

후자
bar1 = if foo1=14 
    foo1*3 
end 
#=> 42 

bar2 = foo2*3 if foo2=14 
#=> NameError: undefined local variable or method `foo2' for main:Object 

은 루비 기준 후의 할당을보고 그렇게하는 방법 대신에 로컬 변수로서 취급 foo2. 이것은 단지 문제가있는 경우 :

당신은 의도적으로 조건에 할당 (어떤지를 테스트하지)를 사용하는
  • 이이 변수가 할당 된 것을 (소스 순서의 관점에서) 처음 범위에.
+0

'경고 : 찾음 = 조건부에서 =='이어야합니다. –

+0

@ JonasElfström 예, 그 또한 있습니다. 그러나 문제는 여전히 남아 있습니다. Ruby에서 공통적으로 (개인적으로 그리고 다른 사람들의 코드에서) 조건문에 할당을 사용합니다. 'if user = User.find (42) then ... end'. 슬프게도, 할당이 단일 행의 후행 조건에있는 경우 로컬 변수에 대한 경험적 방법은 작동하지 않습니다. – Phrogz

+0

@Phrogz, 왜 후행 조건에서 할당이 실패하는지 이해하려고합니다. 그것에 대해 더 자세히 읽을 수있는 곳은 어디입니까? – Leito

2

if 문을 먼저 넣으면 둘 중 하나를 사용할 수 있지만 '끝'으로 조건을 닫아야합니다.

if 1==1 
    do_something(with params) 
end 
0

다음은 foo으로 지정합니다.

foo = true unless defined?(foo) #Leaves foo as nil 

루비 변수 foo를 생성하고 (구문 분석 나는 생각한다) 읽기 전무 foo = true 비트를 할당하고, 그것을 읽을 때 다음 unless defined?(foo) (나는 생각한다, 실행) 때문이다, 그것은 말한다 foo이 정의되었으므로 (이 값은 nil로 정의 됨) foo = true 부분을 실행하지 않습니다. 당신이

unless defined?(foo) 
    foo = true 
end 

을 한 경우

당신은 foo true로 만 담당 얻을 것입니다.

에 대해 혼란스러워하기 때문에 What are the Ruby Gotchas a newbie should be warned about?에 추가했습니다.

그래, 경우에 따라 문제가 될 수 있습니다.

관련 문제