1

その中にローカル関数を含む関数を作成しようとしています。メイン関数は外部ソースから出力を受け取り、その内部の関数はその入力を変換し、後で使用するために結果を返す必要があります。私の問題は、私が現在これを試みている方法で、メイン関数内に最初のローカル関数を入れようとすると、nil. 次に例を示します。

function stats(input)
    height, weight, name, age, gender, relate = string.match(input, "(%d*)ft,(%d*)lbs,(%w*),(%d*),(%u*),(%u)")
    if name then
        function nameInit(relate)
            relateTable = {["F"] = "Friend", ["R"] = "Relative"}
            for k,v in pairs (relateTable) do
                if relate == k then
                    relship = v
                    return relship
                end
            end
        end
    end
    person = name.." is "..age.." years old, weighs "..weight.." and blah blah blah....
    return person
end
print (stats("5.8ft, 160lbs, Mike Scott, 19, M, F"))

明らかに、この主題は実用的ではありませんが、私がやろうとしていることは、エンドレスポンスの点で同じ方向に沿っています. 私は現在取得していlua: filename: attempt to concatenate global 'relship' (a nil value)ますか?ネストされた関数がなくても、必要な応答を得ることができます。しかし、受け取りたい応答について詳しく説明し、その関数をグローバル関数内に配置しようとすると、これらの応答が得られ始めます。これは、他の関数内で関数を使用しようとするたびに問題になるようです。2 つの個別のグローバル関数を作成し、いずれかの結果を出力できます。しかし、私が別のものを使用しようとすると、私は自分自身を台無しにします. 初心者が何を間違っているのかをよりよく理解するのに少し時間をかけることができる人なら誰でも素晴らしいでしょう! 皆さんありがとう。

4

1 に答える 1

2

「その中の関数は、その入力を変換し、後で使用するために結果を返す必要があります」というあなたの声明に基づいて、ネストされた関数があなたが望むものかどうかわかりません。あなたは、2 つのグローバル関数がある場合、コードが機能すると言います。

function func1(args)
    ...
end

function func2(args)
    ...
end

しかし、(たとえば)func1内部func2にネストすると、機能しなくなります。Lua ではネストされた関数を定義できますが、それらを使用する理由は 2 つしか思いつきません。

  1. タスクをカプセル化する関数を返します。通常、ラッパー関数の引数および/またはローカルの一部を上位値として使用します。
  2. ラッパー関数内から呼び出される関数に一部のロジックをカプセル化し、他の関数がそれを呼び出す必要はありません。

ケース 1 の例:

function func2(a, b, c)
   function func1()
       do something with a, b, c eventhough they are not args of func1
       return result
   end
   return func1
end

someFunc = func2(1,2,3)
....
result = someFunc() -- calls func1 created inside func2, using 1,2,3 

ケース 2 の例:

function func2(a, b, c)
   function func1()
       do something with a, b, c eventhough they are not args of func1
       return result
   end
   result = func1()
   ...
end

func2(1,2,3)

ネストされた関数を引数として渡されたテーブル オブジェクト (クラス) に追加することもできますが、これはケース 1 のバリエーションと見なされます。

于 2014-05-15T01:45:49.980 に答える