2014-10-29 3 views
2

루비 코드루비 범위/바인딩

def foo; "foo:function"; end 
puts foo 
puts foo() 
foo = "foo:value" 
puts foo 
puts foo() # Didn't expect this to work! 

의 다음 코드의 출력은

foo:function 
foo:function 
foo:value 
foo:function 

이 기괴, 나는 현재 범위에 바인딩 하나가 생각했을 것입니다 이런, 그런 것처럼 보이지는 않습니다.

추신 : Python에서 동등한 코드를 실행하면 예상 결과가 나타납니다. 즉, 문자열을 foo에 바인딩 한 후 foo()를 호출하는 마지막 명령문이 오류를 발생시킵니다.

편집 :

<function foo at 0x7fb71d912578> 
foo:function 
foo:value 
TypeError: 'str' object is not callable 

편집 2 :

출력 (수정)을 생성

def foo(): return "foo:function" 
print foo 
print foo() 
foo = "foo:value" 
print foo 
print foo() 

:

다음 파이썬 등가 예제

루비에서는 파이썬과는 달리 주어진 심볼이 동일한 스코프 (메소드 및 인스턴스 변수와 같은)에 두 개의 바인드를 가질 수 있습니다.

+0

괄호 사용은 Ruby에 메소드 호출을 명시 적으로 알려줍니다. – August

+0

내 대답이 유용 했습니까? – daremkd

답변

2

시도해 보겠습니다. 괄호없이 foo를 넣으면 "foo : value"가 표시됩니다.()로 명시 적으로 말하지만 이것은 방법입니다. 코드의 끝 부분이 2 개 개의 라인을 넣어보십시오 :

puts defined? foo #=> local-variable 
puts defined? foo() #=> method 

당신은 유용 할 this SO answer을 찾을 수 있습니다, 특히이 부분 :

이 왜 지역 변수에 "그림자"방법에 대한 이해가 않습니다 그리고도 아니다 주위에 ? 메소드가 로컬 변수를 그늘지게했다면, 은 더 이상 그 지역 변수를 역 참조 할 수 없습니다. 그러나 로컬 변수가 그림자 메서드 인 경우 해당 메서드를 호출하는 방법이 여전히 있습니다. 즉, 수신기가없는 인수없는 메서드를 호출 할 때만 모호성이 있음을 기억하십시오. 수신기 또는 명시 적 인수 목록을 추가하면 여전히 메소드 호출 :

+0

마지막 인용문 부록 : ".. 만약 당신이'send'를 사용하여 수신기에서 메소드를 호출하면 (여기'send : foo' 또는'send"foo "'). 좋은 대답. –