2014-07-04 5 views
1

나는 최근 완전히 이해하지 못하는 루비 잡았다를 발견했다. 그래서, 누군가가 루비에서 이러한 2 개 다음 문장이 당신의 문제의 하나처럼 oneliners을 이해하려면 같루비의 하나의 라이너 "and return"

puts "foo" and return if true 

VS

if true 
    puts "foo" 
    return 
end 

답변

5

하지 왜 나에게 설명 할 수있는, 당신은 루비 연산자를 암기 할 필요가 우선 순위. 또는 더 정확하게는 Ruby 구문입니다. Ruby 인터프리터가하는 것과 똑같은 방법으로 문장을 볼 필요가있다. 그것은 당신의 두 번째 본성이되어야합니다. 우리가 지금 한 줄을 살펴

puts "foo" and return if true 

우리가 먼저 관련이없는 문제를 분리하자 보자. 키워드 return은 메서드 나 람다에서만 사용할 수 있으며 실제로 질문의 대상이 아닙니다. 또한 후행 if true은 항상 유효하므로 불필요한 것처럼 보입니다. 일반적으로 질문을 논의하기 위해, 우리는 방법 #bar 및 변수 baz

def bar 
    puts "bar" 
end 

baz = true 

을 정의 할 수와 루비 구문을 기억 한 경우

puts "foo" and bar if baz 

, 당신이 될 것입니다 우리가 수정 한 줄에 대해 이야기하자 정확히 루비와 같은 라인 괄호로 묶다 수 그것을보고 :

(puts("foo") and (bar)) if (baz) 

아주와 연산자처럼 if 동작합니다 후행 낮은 우선 순위. 처음부터 if까지 전체 줄은 baz이 truey 인 경우에만 실행됩니다. 따라서

puts "foo" and bar 

이 실행됩니다. 다음과 같이이 괄호된다

puts("foo") and (bar) 

화면에 foo 인쇄 및 nil를 반환 puts "foo" 먼저 실행되는 것을 볼 수 있습니다. nil이 거짓이므로 운영자 and이 반환하고 오른쪽에 bar이 실행되지 않습니다. 당신은 차이를 볼 수 있습니다

(puts("foo"); bar) if (baz) 

: puts "foo"barand으로 가입하지 않은,하지만 독립적 인 논리적 줄 수 있습니다에

if baz 
    puts "foo" 
    bar 
end 

에 관해서는

그것은 동일합니다. 첫 번째 줄의 반환 값은 무시되고 두 번째 줄의 실행에는 영향을 미치지 않습니다.

마지막으로 and&&으로 바꿀 때 어떤 일이 발생하는지 살펴 보겠습니다.&& 오퍼레이터

puts "foo" && bar 

oneliner and보다 더 높은 우선 순위를 갖기 때문에 말하면

puts("foo" && bar) 

된다, "foo" && bar 값 먼저 계산하고 #puts 방법 인수로 전달 될 것이다. 문자열 "foo"이 참으로 간주되므로 실행이 bar으로 진행되고 "bar"이 화면에 출력되고 nil을 반환합니다. 당신은

"foo" && bar 

의 값을 직접 시도 부작용으로 화면에 출력 "bar"으로, nil입니다 수 있습니다.

puts("foo" && bar) 

따라서 비어있는 회선을 야기

puts(nil) 

이 화면에 출력되도록된다.

사기는 구문을 배워야한다는 것입니다. Ruby 디자이너는 책과 같이 한눈에 코드를 읽을 수있는 큰 발전을 이루었습니다.

+0

설명해 주셔서 감사합니다. 그러나 "사용자는 학습의 작은 단계를 만들기 위해 게으르면 안된다." 다소 겸손하다. – Yoni

+0

@Jonathan, 일부 사람들이 경악을하는 것 같으면 사과드립니다. 나는 원하는 유창한 단계를 완전히 달성하지 못했습니다. 나는 Matz가 가능한 한 인간의 문장에 가깝게 언어 라인을 만들기 위해 노력한 보이지 않는 엄청난 노력을 강조하고 싶었습니다. 큰 선물이고 그것을 배우기 위해 필요한 노력은 그것을 개발하는 데 필요한 노력에 비해 훨씬 더 작습니다. 나는 사용자가 얻는 보상이 너무 커서 구문을 배우는 단계가 그것에 비해 작게 나타날 것이라고 말한다. 나는 나쁜 자질을 암시하지 말고, 격려하기로했다. –

+0

안녕하세요? 나는 너와 이야기해야 해. 내 이메일에 답장 해 주 겠니, 며칠 전에 보냈지? :-) –

관련 문제