1

関数内で使用しようとしていますin pairsが、機能しません。最初の行 (キー) を出力するだけです。これは私のコードです:

set = {1,2,3,4};
unset = {5,6,7,8};

    function listen(ftype)
        if (ftype == [[~]]) then
            for num,str in pairs(set) do
                return str;
            end
        end
        if (ftype == [[$]]) then
            for num,str in pairs(unset) do
                return str;
            end
        end
    end

    print(listen([[~]])..[[ =:= ]]..listen([[$]]));

こんなことしたら..

for num,str in pairs(unset) do
    print(str);
end

それは魅力のように機能します。それはまさに私が欲しいものですが、関数内にあります。

4

2 に答える 2

7

独自のイテレータを作成できます:

function double_pair(t1, t2)
    local i = 0
    return function() i = i + 1
               return t1[i] and t1[i] .. " =:= " .. t2[i] 
           end
end

次に、次のように使用できます。

for str in double_pair(set, unset) do
    print(str)
end

出力:

1 =:= 5
2 =:= 6
3 =:= 7
4 =:= 8

ステートメントが 1 行にあり、それらを明確にしたい場合を除き、ステートメントを終了するためにセミコロンは必要ないことに注意してください。And[[ =:= ]]は通常、長い複数行の文字列を作成するために使用されます。通常、二重引用符" =:= "または単一引用符の使用を選択します' =:= '

于 2013-10-26T03:36:54.537 に答える
2

関数は複数回返すことはできません。ループ内に無条件returnを入れるのは無意味です。ループの 2 回目の反復には決して到達しません。

基本的に、関数から複数の値を返そうとしています。Lua はそれをサポートしています。たとえば、単に return 1,2,3,4. 戻り値の数が不明な場合は、次のように、それらをテーブルに構築して呼び出すことができますunpack

function listen(ftype)
    local result = {}
    local num, str
    if (ftype == [[~]]) then
        for num,str in pairs(set) do
            table.insert(result, str)
        end
    elseif (ftype == [[$]]) then
        for num,str in pairs(unset) do
            table.insert(result, str)
        end
    end
    return unpack(result)
end

しかし、結果はすでにいくつかのテーブルにあるため、そのように再構築するのはばかげています。オリジナルを解凍するだけです:

function listen(ftype)
    if (ftype == [[~]]) then
        return unpack(set)
    elseif (ftype == [[$]]) then
        return unpack(unset)
    end
end

偉大な。しかし、関数呼び出しをprintステートメントのような式に入れると、最初の値のみが返されるため、最初の場所に戻ります。

したがって、ペアを印刷するには、次のいずれかを行う必要があります。

1)関数のでいくつかの反復を行う、
または2)関数
で 実際の印刷を行う

@YuHao で提案されているように、最もクリーンなソリューションはおそらくカスタム イテレータです。

于 2013-10-26T03:45:30.227 に答える