5

私は次のようないくつかの変数を設定しました:

local var1Age = 10
local var2Age = 20
local var3Age = 30

今、私は次のようなループでそれらを繰り返したいです:

for i=1, 3 do
    if var..i..Age >= 21 then
        print("yep")
    end
end

変数を変更したり、代わりにテーブルを作成したりすることはできません。このvarsで何とか可能ですか?

編集: 私はこのようなことができます:

if var1Age >= 21 then
    print("yep")
end
if var2Age >= 21 then
    print("yep")
end
if var3Age >= 21 then
    print("yep")
end

しかし、私はそのような約50の変数を持っています。そのため、ループでそれを行う方法を検索します。

Edit2: 変数は変更できないクラスによって設定されるため、変数の設定方法を変更することはできません。たとえば、次のように変数を設定することはできません。

local varAge = {}
varAge[1] = 10
varAge[2] = 20
varAge[3] = 30

Edit3: クラスは次のようなテーブルに変数を保存します: http://ideone.com/iO4I8N

4

3 に答える 3

5

debug.getlocal関心のある変数を名前でフィルタリングして、すべてのローカル変数を反復処理できます。http://www.lua.org/pil/23.1.1.html

使用方法の例を次に示します。

local var1Age = 10
local var2Age = 20
local var3Age = 30

function local_var_value(n)
    local a = 1
    while true do
        local name, value = debug.getlocal(2, a)
        if not name then break end
        if name == n then
            return value
        end
        a = a + 1
    end
end

for i=1, 3 do
    local v = local_var_value("var"..i.."Age")
    if v and v >= 21 then
        print("yep")
    end
end
于 2013-10-28T11:26:05.537 に答える
4

言語の使用をここまで伸ばしたいと本当に思っていますか? ライブラリの使用は、他のdebug方法でできない場合は、高度な使用のために残しておく必要があります。

プログラミングの問題は、「通常の」Lua 機能を使用して、より洗練された方法で解決できるかもしれません。変数のシーケンスに数値でインデックスを付けるには、単純にテーブルを配列として使用します。

local varAge = {}
varAge[1] = 10
varAge[2] = 20
varAge[3] = 30

for i=1,#varAge do
    if varAge[i] >= 21 then
        print("yep")
    end
end

編集

本当に使用する必要があり、パフォーマンスが本当に問題である場合は、ローカルを一度だけスキャンし、それらの値をテーブルに格納するdebug.getlocal潜在的な O(n 2 ) 動作を回避できます。

local var1Age = 10
local var2Age = 20
local var3Age = 30

local function GetLocalVars( level )
    local result = {}
    for i = 1, math.huge do
        local name, value = debug.getlocal( level, i )
        if not name then break end
        result[ name ] = value
    end
    return result
end

local local_vars = GetLocalVars( 2 )

for i = 1, 3 do
    local name = "var"..i.."Age"
    local v = local_vars[ name ]
    if v and v >= 21 then
        print("yep")
    end
end
于 2013-10-28T12:19:06.100 に答える