2016-07-21 2 views
4

가끔씩 서로를 호출하는 두 개의 함수가 있으며 다른 함수를 빌드하는 데 사용하는 모듈의 로컬 함수입니다. 이 모듈은이 코드 조각 다소 유사하다 : 나는 오류 attempt to call global 'isodd' (a nil value)을 얻을 다른 파일에서 evenOrOdd를 호출 할 때서로를 호출하는 로컬 함수

local function iseven(n) 
    if n == 1 then 
     return false 
    else 
     return isodd(n - 1) 
    end 
end 

local function isodd(n) 
    if n == 1 then 
     return true 
    else 
     return iseven(n - 1) 
    end 
end 

local evenOrOdd = function(n) 
    return iseven(n) and "Even" or "Odd" 
end 

return evenOrOdd 

문제가있다.

iseven을 전역으로 설정하면 이러한 일이 발생하지 않는 것으로 나타 났지만 모듈에 로컬로 보관하고 싶습니다.

iseven이 선언 된 줄 앞에 더미 함수 선언 (local function isodd() end)을 넣기까지했습니다. 또한 더미 함수 선언 자리에 그냥 local isodd 삽입 시도했지만 두 가지 방법으로 작동하지 않으며 다른 종류의 오류가 발생합니다.

I 루아 클로저가 있고 iseven 선언되면 그것이 후 계산하지 않고 수정하거나 nil 또는 더미 함수이다 isodd의 실제 값을 포착하고 있지만,이 바이 패스 할 수있는 방법이기 때문이다 알 이? num%2에 대한

+2

루아에서 앞쪽 선언의 예 :'local f; 지역 함수 g() return f() end; function f() return g() end' –

+0

@Egor Skriptunoff 아 맞다. 내가 그 질문에서 말했듯이, 나는 그것을 시도했다. 하지만'function isodd (n)'전에'local'을 삭제하는 것을 잊어 버렸고'upvalue 'isodd (nil value) 오류를 호출하려고했습니다. 감사. – user6245072

+0

당신이 준 코드에 대한 에러 메시지는'시도하려고했음을 글로벌 'isodd (nil 값)'로해야합니다. – lhf

답변

-1

더 나은 체크 - 분할

+1

이것은 함수가 어떻게 작동하는지 보여주는 예입니다. 그들은 여기에 복사하기에는 너무 길기 때문에 어쨌든 질문에 답할 수 있습니다 (주석 참조). – user6245072

5

문제의 나머지 iseven에서 isodd에 대한 호출이 글로벌 변수, 나중이 아니라 정의 된 지방을 사용한다는 것입니다. @Egor에 의해 제안

사용 앞으로 선언 :

local iseven, isodd 

function iseven(n) 
... 
end 

function isodd(n) 
... 
end 

... 
2

이 문제 과거를 얻을 수있는 또 다른 방법은 테이블을 사용하는 것입니다. 일반 지역 변수가 더 효율적이지만 테이블을 사용하면 선언을 관리 할 필요가 없습니다.

local T = {} 

local function evenOrOdd(n) 
    return T.iseven(n) and "Even" or "Odd" 
end 

function T.iseven(n) 
    -- code 
end 

이의 요지는 테이블 상단에 정의되어 있기 때문에, 그 아래 모든이에 대한 액세스 권한을 가지고 있으며, 당신이 동적으로 내용의 변경 수 있다는 것입니다. evenOrOdd이 정의 된 경우 정의되지 않았더라도 이 호출되면 T.iseven이 이미 정의되어 있어야합니다.

관련 문제