2014-08-28 3 views
-1

로컬 변수 스코프가 현재 블록에 있으므로 블록을 사용하는 루핑 구문이 새로운 어휘 범위를 정의하므로 외부에서 변수에 액세스 할 수 있습니다. 따라서 그렇지 않은 사람은 그렇지 않습니다. 여기 블럭에 대해 혼란스럽고 Ruby에서 로컬 스코프가 작동하는 방식에 대해 혼동을 들었습니다.

내가 놀리려는에서 실행 예입니다

루프 문 블록을 소요하기 때문에 자신의 지역 변수가 있습니다

>loop do 
    k = 100 
    break 
end 

>defined? k 
# => nil 

블록을하지 않는 while 문 대 :

:

여기
>while true 
j = 100 
break 
end 

>defined? j 
# => 'local-variable' 

는하지만 혼란 마지막 문이도 같이 쓸 수있다 것입니다

>while true do 
j = 100 
break 
end 

>defined? j 

# => 'local-variable' 

블록처럼 보이지만 그렇지는 않습니다. 다음 마지막으로

:

while true { 
m = 100 
return 
} 

에 구문 오류가 있습니다.

내 결론은 실제로 do-end 블록이 실제로 블록이되는 것은 아니며 루비 소스 코드를 읽거나 읽는 것 이외의 코드를 읽을 때 어휘 범위로 정의 된 것을 아는 명백한 방법이 없다는 것입니다 ri가 core ruby에 관한 문서를 제공하도록 ..). 이것은 명백한 무언가 일지 모르지만 Ruby를 처음 접했고 규칙을 읽거나 (심지어 루비 소스 코드 일지라도) 읽을 수있는 코드를 읽음으로써 코드를 올바르게 읽는 데 도움이됩니다. TIA

+0

'정의 란 무엇입니까? 비표준 방법을 사용하는 경우 설명하십시오. – sawa

+0

비표준이 아닙니다. 오타입니다. 나는 "정의?"를 의미했습니다. – tarzan

+0

왜 투표가 늦습니까? 이것은 잘못된 질문입니까? (오타를 정의하는 것 이외) – tarzan

답변

2

귀하의 혼란은 정확하게 '블록'이 무엇인지 모르는 것으로부터 비롯된 것처럼 보입니다.

내 결론은 ... 엔드하지 모든 블록이 블록

이 사실이 실제로 있음을

과 어휘 범위로 정의하는 것을 알 수있는 명확한 방법이 없습니다 단지 그것을 아는 것 이외의 코드를 읽을 때

... 이것은별로.

do/end do not block make. 블록은 메소드 호출과 밀접하게 결합 된 것으로 정의됩니다. 보다 구체적으로 블록은 메소드 호출 다음에 합법적입니다. 'loop'는 Kernel 클래스의 메소드입니다. 'true'와 'while'은 메소드가 아닙니다. 따라서 당신이보고있는 행동은 옳습니다.

괄호는 일반적으로 한 줄에 들어 맞는 블록에 사용되며 여러 줄 블록은 보통 do/end 사이에서 구분됩니다. 그러나 관련된 메소드 호출이 없다면, do/end는 이것이 블록이라는 것을 의미하지 않는다.

+0

답장을 보내 주신 Darren에게 감사드립니다. 블록의 정의를 이해하는 것은 확실하지 않습니다.귀하의 대답에서 이해할 수있는 것은 구문을 블록으로 고유하게 식별하는 특별한 구문이 없다는 것입니다. 그것은 do-end 또는 {}로 둘러싸여 야하고 메소드에 전달되어야합니다. loop는 Kernel의 메소드이고'while '은 그림에 맞는 언어의 일부이기 때문에 어떻게 든 비 - 메소드를리스트로 알 필요가 있습니다. 부수적으로 나는'true {n = 100; break;}'그리고 여전히 구문 오류가 있습니다. – tarzan

+0

나는 더 명확해질 수 있었다. 중괄호를 사용하면 100 % 차단됩니다. 따라서 위의 예제가 작동하지 않는 이유 (방법 없음). do/end는 블록이 아니며 루핑 구문 중 하나 (for, while, until)와 함께 사용됩니다. 따라서 블록은 중괄호 안에 있고, for/while, while 루프가 아닌 do/end 안에있는 것입니다. 내가 간과 한 do/end의 대소 문자 사용법이있을 수 있지만 그렇게 생각하지는 않습니다. –

+0

이것은 기본적으로 내가 필요로하는 대답이며, 나는 이것들이 do-end의 의미를 바꾸는 유일한 표현이라는 것을 확실히 알고 싶습니다. 그것은 확실히 그렇게 보인다 : http://www.ruby-doc.org/core-2.1.2/doc/syntax/control_expressions_rdoc.html – tarzan

관련 문제