나는 최근 완전히 이해하지 못하는 루비 잡았다를 발견했다. 그래서, 누군가가 루비에서 이러한 2 개 다음 문장이 당신의 문제의 하나처럼 oneliners을 이해하려면 같루비의 하나의 라이너 "and return"
puts "foo" and return if true
VS
if true
puts "foo"
return
end
나는 최근 완전히 이해하지 못하는 루비 잡았다를 발견했다. 그래서, 누군가가 루비에서 이러한 2 개 다음 문장이 당신의 문제의 하나처럼 oneliners을 이해하려면 같루비의 하나의 라이너 "and return"
puts "foo" and return if true
VS
if true
puts "foo"
return
end
하지 왜 나에게 설명 할 수있는, 당신은 루비 연산자를 암기 할 필요가 우선 순위. 또는 더 정확하게는 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"
및 bar
이 and
으로 가입하지 않은,하지만 독립적 인 논리적 줄 수 있습니다에
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 디자이너는 책과 같이 한눈에 코드를 읽을 수있는 큰 발전을 이루었습니다.
설명해 주셔서 감사합니다. 그러나 "사용자는 학습의 작은 단계를 만들기 위해 게으르면 안된다." 다소 겸손하다. – Yoni
@Jonathan, 일부 사람들이 경악을하는 것 같으면 사과드립니다. 나는 원하는 유창한 단계를 완전히 달성하지 못했습니다. 나는 Matz가 가능한 한 인간의 문장에 가깝게 언어 라인을 만들기 위해 노력한 보이지 않는 엄청난 노력을 강조하고 싶었습니다. 큰 선물이고 그것을 배우기 위해 필요한 노력은 그것을 개발하는 데 필요한 노력에 비해 훨씬 더 작습니다. 나는 사용자가 얻는 보상이 너무 커서 구문을 배우는 단계가 그것에 비해 작게 나타날 것이라고 말한다. 나는 나쁜 자질을 암시하지 말고, 격려하기로했다. –
안녕하세요? 나는 너와 이야기해야 해. 내 이메일에 답장 해 주 겠니, 며칠 전에 보냈지? :-) –