3

さて、Lua の長さ演算子の特別な仕様により、Luaが次のような状況で負の値を返すことを「許可」するかどうか疑問に思いました。

#{[-5]=1,[-1]=3}

それは言います:

テーブルの長さは、is notやisなどのt任意の整数インデックスとして定義されます。nt[n]nilt[n+1]nil

n=-5私の例では、この基準をn=-1満たすでしょうか?

さらに、 が の場合t[1]nilゼロにnなる可能性があります。

そうです、ゼロになる可能性がありますが、保証されていませんよね?

1 から与えられた n までの nil 以外の値を持つ通常の配列の場合、その長さはちょうど n (最後の値のインデックス) です。

今回はそうではないので当てはまりません。

配列に「穴」 (つまり、nil他の非 nil 値の間の値) がある場合、 #t は、値の直前にある任意のインデックスにすることができnilます (つまり、そのようなnil値を配列の末尾と見なすことができます) )。

ここでもそうですがn=-5n=-1有効な戻り値ですよね?

Lua が例のテーブル、または負のインデックスのみを含む他のテーブルに対して常に 0 を返すことを完全に確信できますか? (仮説として) もし私が Lua インタープリターを書いていて、それらの値のいずれかを返すとしたら、仕様に準拠していることになりますか?

編集

明らかに、Lua の実装方法では、負の値は返されません。長さ演算子のドキュメントがやや不足しているように感じました。Lua 5.2 のドキュメントが変更されたようです。それは今言う:

__lenメタメソッドが指定されていない場合、テーブルの長さは、テーブルがシーケンスtである場合にのみ定義されます。つまり、正の数値キーのセットが整数nに対して{1..n}に等しい場合です。その場合、nはその長さです。次のようなテーブルがあることに注意してください

  {10, 20, nil, 40}

4はキーを持っていますが、キーを持っていないため、シーケンスではありません3

そのため、正の数値キーについて説明するようになり、より明確になりました。私は賢明なままですが、ドキュメントに完全に満足しているわけではありません。「長さはテーブルがシーケンスの場合にのみ定義される」と記載されている場合、テーブルがシーケンスでなくても値が返されるが、動作は未定義であることも記載する必要があります。また、この表はシーケンスによく似ています。

a = setmetatable(
  {0},
  {
    __index = function(t,k)
      return k < 10 and k or nil 
    end
  }
)
i = 1
while a[i] do
  print(a[i])
  i = i+1
end
--[[ prints:
0
2
3
4
5
6
7
8
9
]]
print(#a)
-- prints: 1

ただし、混乱がどのようなものになるかを考慮に入れることが意味がないことは明らかであるため、これはつまらないものになりつつ__indexあります。また、Stackoverflow は、より正確なドキュメントについて文句を言う場所ではありません。

4

2 に答える 2