2012-11-16 3 views
6

인수를 lua_resume 및 lua_yield에 전달하는 목적은 무엇입니까?루아 : lua_resume 및 lua_yield 인수 목적

나는 lua_resume에 대한 첫 번째 호출에서 인수가 재개되는 루아 함수에 전달된다는 것을 알고 있습니다. 이것은 의미가 있습니다. 그러나 나는 lua_resume에 대한 모든 후속 호출이 동시 루틴의 함수에서 인수를 "업데이트"할 것으로 기대합니다. 그러나 그런 경우는 아닙니다.

lua_yield가 반환하기 위해 인수를 lua_resume에 전달하는 목적은 무엇입니까? 코 루틴에서 실행되는 루아 함수가 lua_resume에 전달 된 인자에 접근 할 수 있습니까?

답변

10

Nicol이 말한 바. 당신은 여전히 ​​당신이 원하는 경우 첫 번째 resume 호출에서 값을 보존 할 수 있습니다 :

do 
    local firstcall 
    function willyield(a) 
    firstcall = a 
    while a do 
     print(a, firstcall) 
     a = coroutine.yield() 
    end 
    end 
end 

local coro = coroutine.create(willyield) 
coroutine.resume(coro, 1) 
coroutine.resume(coro, 10) 
coroutine.resume(coro, 100) 
coroutine.resume(coro) 

1 1 
10 1 
100 1 
+0

나는 이것이 질문에 대답하지 않는 것처럼 느낀다.OP는 표준 라이브러리'coroutine.resume()'과 다른 의미를 갖는/C API/함수 lua_resume()과 lua_yield()에 관한 것이었다. (예를 들어, lua_resume은 세 개의 인수를 취한다 - 두 개는 lua_State ...) – BadZen

+0

필자는 매개 변수 전달의 목적에 대한 질문에 대답하고 루아 인터프리터를 사용하기 쉽도록 예제를 제공한다고 생각합니다. 사실 니콜 (Nicol)의 대답에 따르면 OP는 그의 발언에서 많은 것을 말했다. 당신이 더 나은 사람이라면 언제든지 자신의 대답을 줄 수 있습니다. –

+0

libs의 coroutine 객체 (예 : lua_State를 캡슐화 함)와 C API를 사용하면 큰 차이가 있습니다. 나는 더 좋은 대답이 없으므로 C API에 관해 특별히 묻는 또 다른 질문을 열었다. 니콜 (Nichol)의 대답과 여기에있는 내용은 모두 coroutine 라이브러리 객체에 대해 이야기합니다. lua_ * API 측면에서이를 구현하는 약 100 줄의 코드가 있습니다. 명확하지 않으며 문서에 대한 자세한 내용은 짧습니다. – BadZen

5

루아는 마술로 원래 인수에 새로운 값을 부여 할 수 없습니다. 최적화에 따라 더 이상 스택에 없을 수도 있습니다. 게다가 코드가 생성되었을 때 그 코드가 어디에 있었는지 알 수 없기 때문에 더 이상 그 코드를 볼 수 없을 수도 있습니다. 예를 들어 coroutine이 함수를 호출하면 새 함수는 이전 함수로 전달 된 인수를 볼 수 없습니다.

coroutine.yield()은 coroutine을 계속하는 resume 호출에 전달 된 인수를 반환하므로 yield 호출 사이트에서 원하는대로 매개 변수를 처리 할 수 ​​있습니다. 그것은 재개 작업을 수행하는 코드가 특정한 코드와 통신하도록 허용합니다. yield()은 인수를 resume의 반환 값으로 전달하고 resume은 반환 값으로 인수를 yield에 전달합니다. 이것은 의사 전달의 통로를 설정합니다.

다른 방법으로는이를 수행 할 수 없습니다. 확실히 yield 사이트에서 볼 수없는 인수를 수정하면 안됩니다. 간단하고 우아하며 이해가됩니다.

또한 누군가의 가치를 파헤 치는 것은 매우 무례한 것으로 간주됩니다. 특히 이미 작동중인 기능. 기억하십시오 : 인수는 값으로 채워진 로컬 변수입니다. 사용자는 변수 자체가 변경되지 않는 한 변수의 내용을 변경하지 않아야합니다. 결국 변수는 local입니다. 로컬로만 변경할 수 있습니다. 그러므로 이름.

+0

감사를 인쇄합니다! 따라서 일단 coroutine이 시작되면 지역 값을 외부 적으로 수정할 수 없습니까? 글로벌 변수에 의한 코 루틴의 내부와 통신 할 필요가 있다고 가정하고 싶습니다. 예를 들어 게임에서 코 루틴 (coroutine)이 멀리있는 다른 물체의 수를 알아야하는 "근처 물체"가있을 수 있습니다. 이렇게하려면 인근 물체의 수를 저장하는 전역을 가져야합니다. 네임 스페이스를 전역으로 채우는 것을 피하기 위해 내가 다시 시작하기 바로 직전에 코 루틴에 값을 매길 바랬다. – RandyGaul

+0

값을 수정할 수 있습니다. coroutine.yield() 호출의 결과를 원래 매개 변수와 동일한 변수에 지정하면됩니다. 예를 들어 내 대답 좀 봐. –

+0

@RandyGaul : "일단 코 루틴이 시작되면 로컬 값을 외부에서 수정할 수 없습니다. *"로컬 변수는 외부에서 수정할 수 없습니다. * period *; 코 루틴은 특별하지 않습니다. 이 숫자를 전달하려면 매개 변수로 'resume'에 전달하고 'yield'의 반환 값으로 수집하십시오. 앞서 말했듯이, 그것은 당신이 가지고있는 통신 인터페이스입니다. –