9

一部の Lua 関数nilは、関数が何らかのタスクを実行できなかったことをユーザーに通知するために返されます (例: tonumber()string.find())。

C では、returnignilは次のように行われます。

int some_function(lua_State* L) {
  ...
  if (some condition) {
      lua_pushnil(L);
      return 1;
  }
  ...
}

ただし、代わりに次のことを行っても問題ないのではないかと思います。

int some_function(lua_State* L) {
  ...
  if (some condition) {
      return 0;
  }
  ...
}

短いです。試してみたところ、うまくいくようですが、それが設計によるものかどうかはわかりません。Lua のソース コードを調べたところ、このパターンが見当たらないreturn 0ので、これを行うのが正当かどうか疑問に思います。

nil同等のものを返す2つの異なる方法はありますか?

(ところで、私は例外(つまり、lua_error())を介してエラーを通知することについてすべて知っているので、言及しないでください。)

アップデート:

2 つの方法には微妙な違いがあることがわかりました。print((function() end)())何も出力しないのに対し、print((function() return nil end)())「nil」を出力します。これがどれほど重要かわかりません。

4

3 に答える 3

5

はい、これは完全に有効です。存在するよりも多くの戻り値を要求/割り当てようとしている場合 (1 つまたは 10 を取得しようとしても) nil、未定義のもの (つまり、返されないもの) を取得します。

function test1()
    return 5
end

local a, b = test1()
-- a = 5, b = nil

function test2()
    return 1, 2
end

local c, d, e = test2()
-- c = 1, d = 2, e = nil

function test3()
end

local f, g = test3()
-- f = nil, g = nil

特別なケースでも何でもないので、Lua のソースではおそらく見つからないでしょう。これは、戻り値を処理するための Lua の一般的な方法です。

アップデート:

戻り値を出力しようとして気付いた違いは、これが単なる代入ではないという事実です。もちろん、返すnilことと何も返さないことにはわずかな違いがあり、そこで区別することは可能です。最終的には、関数の動作を適切に文書化する必要があります。つまり、何が起こるべきかをユーザーに伝えます。たとえば、戻るnil(またはnil代入を取得する) ことはエラー状態を表す可能性がありますが、エラーが発生した場合は何も返さず、nil値が無効であると想定される場合、またはnil(エラーは発生していない) 場合は返すこともできます。

于 2013-08-29T23:07:56.083 に答える
2

nilこのとの間の人為的な違いno valueは一貫性がなく、かなり厄介です。

local function f1() return nil end
local function f0() end

local v1 = f1()     -- OK, assigns nil
print(type(f1()))   -- OK, prints 'nil'

local v0 = f0()     -- OK, assigns nil
print(type(f0()))   -- Why the hack it raises an error?

私の意見では、関数のパラメーターの受け渡しは、割り当てステートメントのセマンティクスに完全に準拠する必要があります。

于 2013-08-31T07:12:08.877 に答える