2016-07-21 20 views
4

私は時にはお互いを呼び出す2つの関数を持っており、それらを使って別の関数を構築するモジュールにローカルです。モジュールは、コードのこの部分に多少似ています互いに呼び出すローカル関数

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 

私はエラーattempt to call global 'isodd' (a nil value)を取得し、別のファイルからevenOrOddを呼び出すときに問題があります。

isevenをグローバルに設定した場合、これは起こりませんが、モジュールに対してローカルにしておきたいと思いました。

isevenが宣言されている行の前にダミー関数宣言(local function isodd() end)を置くことさえ試みました。私もダミー関数宣言の代わりにlocal isoddを挿入しようとしましたが、どちらの方法でもうまく動作せず、さまざまな種類のエラーが発生します。

私はLuaはクロージャを持っているとisevenが宣言されたとき、それはnilまたはダミー関数のいずれかである、isoddの実際の値をキャッチし、後にそれを修正することはカウントされませんが、回避する方法があるので、これは知っていますこの? num%2ため

+2

Luaでの前方宣言の例: 'ローカルf;ローカル関数g()return f()end;関数f()return g()end' –

+0

@Egor Skriptunoffああ。私がその質問で言ったように、私はそれを試しました。しかし、 'function isodd(n)'の前に 'local'を削除するのを忘れてしまったようで、' upvalue 'isodd(nil value) 'エラーを呼び出そうとしました。ありがとう。 – user6245072

+0

あなたが指定したコードのエラーメッセージは '試みるべきglobal 'isodd(nil value)'でなければなりません。 – lhf

答えて

-1

ベターチェック - 除算の余り

+1

これは、私の関数がどのように機能するかを示す単なる例でした。彼らは本当にここでそれらをコピーするには余りにも長く、質問はとにかく答えることができます(コメントを参照)。 – user6245072

5

問題がisevenisodd呼び出しがグローバル変数ではなく、後に定義されたローカル1つを使用することです。 @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が定義されている場合、evenOrOddが定義されていなくても、T.isevenが既に定義されているはずです。

関連する問題