2011-08-19 6 views
2

프로그래밍 루비을 읽는 동안은, 한 예는 블록 폐쇄로 사용하는 방법을 보여줍니다 경우 우리가 출력 p.call(3)의 가치, 그것은 그러나 Hello Hello HelloRuby에서 블록을 int로 블록에 닫는 이유는 무엇입니까?

, 될 경우 지금

def nTimes(aThing) 
    return proc {|n| aThing * n} 
end 

p = nTimes("Hello ") 

우리 코드는 간단히 puts 3 * "Hello "이고 Ruby는 호환되지 않는 유형에 대해 불평 할 것입니다.

왜? 감사.

+1

'puts "Hello"* 3'을 사용해 보셨습니까? –

+1

오, 너무 당황 스럽네. 고맙습니다. –

+0

어, 저는 루비에 대해 잘 모릅니다. 나는 사과가 사과와 비교되지 않았다는 것을 알아 차렸다. 즉, 루비에서 두 가지 방식으로 작동하지 않는 이유에 대한 설명을 보는 것은 흥미로울 것입니다. 파이썬에서 그 역할을합니다. –

답변

6

문제는 클로저 또는 블록과 관련이 없습니다. 이것은 루비에서 연산자를 다루는 방법과 관련이 있습니다. *+, 피연산자 왼쪽의 오브젝트 같은 이진 연산에

메소드의 수신기이다. 따라서 "hello " * 3을 수행하면 String 클래스의 * 메서드를 호출하고 3을 매개 변수로 전달합니다. String#*의 정의는 정수로 매개 변수를 취하고 self을 여러 번 반복하므로 결과는 "hello hello hello "입니다.

그러나 3 * "hello " 같이 구를 경우 Fixnum 클래스의 * 방법이라고

"hello "는 매개 변수로 전달됩니다. Fixnum#*String 매개 변수를 어떻게 처리해야할지 모르므로 오류가 발생합니다.

+0

고마워요! 나는 나의 질문에 따라 첫 번째 주석을 읽은 직후 그것을 깨달았다. 그러나 당신의 설명은 확실히 정확합니다. –

+0

:) 나는 이것이 루비를 배우는 사람들에게 공통적 인 함정이라고 생각했다. (나는 같은 몇 년 전에 돌아갔다.) 어쩌면 비슷한 질문을하는 사람들을 도울 것이다. – edgerunner

관련 문제