2017-11-10 6 views
0

루비 튜토리얼이 있습니다람다가 초기 값을 재설정하지 않는 이유는 무엇입니까? sitepoint에

def increase_by(i) 
    start = 0 
    lambda { start += i } 
end 

increase = increase_by(3) 
increase.call # => 3 
increase.call # => 6 

왜이 방법을 두 번째로 호출 할 때하지 start 리셋 0에합니까? 함수의 시작 부분에 start = 0이 있다고 가정하고 두 함수를 모두 호출하면 3을 반환하지 않아야합니까?

+0

'start = 0'은 람다 블록 안에 없습니다. 람다가 호출 될 때가 아니라'increase_by (3)'를 호출 할 때 한 번만 호출됩니다. – falsetru

+0

.call을 사용하여 전체 함수를 호출하지 않습니까? 그리고 람다 만있는 것이 아닙니다. – rackymortor

+0

번호'call'은'increase_by'가 아니라'increase'를 호출합니다. – sawa

답변

1

increasecall이 호출 될 때마다 0에 대한 참조가 없어야한다는 것이 꽤 분명합니다. 그랬다면, 어디에서 그런 등을 가져 가야합니까 0?

로컬 변수가 설정되어 있고 람다 생성시 람다에 저장되어 있다고 생각합니다. 그렇지 않으면, 단지 파란색으로 된 컨텍스트에서 람다에 대한 참조가 있다면, 지역 변수가 어디서 왔는지 분명하지 않을 것입니다.

따라서, start은 λ 객체 increase에 결합된다. 동일한 객체에서 call을 호출하기 때문에 start 값이 유지됩니다.

1
increase = increase_by(3) # Sets start to 0 then returns the lambda which whill now increment start by 3 on each call 
increase.call # => 3 # Calls the lambda which adds 3 to start then returns it 
increase.call # => 6 # Same as above