web-dev-qa-db-ja.com

Lua配列(テーブル)が0ではなく1で始まるのはなぜですか?

Luaのこの部分の決定の背後にある理論的根拠を理解していません。インデックス作成が1から始まるのはなぜですか? (他の多くの人がしたように) この素晴らしい論文 を読みました。学習とプログラミングが非常に楽しい言語の奇妙なコーナーのように思えます。誤解しないでください。Luaは素晴らしいですが、どこかに説明が必要です。 (ウェブ上で)私が見つけたもののほとんどは、インデックスが1から始まると言っているだけです。

そのテーマについてデザイナーが言ったことを読むのは非常に興味深いでしょう。

私はLuaの「非常に」初心者であることに注意してください。テーブルについて明らかな何かを見逃していないことを願っています。

119
AraK

Luaは、コンピュータープログラミングの正式なトレーニングを受けていない石油エンジニア向けに設計された言語であるSolに由来しています。コンピューティングの訓練を受けていない人は、ゼロからカウントを開始するのはおかしいと思っています。 1ベースの配列と文字列インデックスを採用することにより、Luaの設計者は最初のクライアントとスポンサーの期待を混乱させることを避けました。

私も最初は奇妙なことに気づきましたが、0ベースの配列を愛することを学びました。しかし、特にLuaの汎用forループとipairs演算子を使用することで、Luaの1ベースの配列で問題ありません。通常、配列のインデックス方法について心配する必要はありません。

130
Norman Ramsey

Programming in Luaのテーブルに関する最初の議論では、彼らは言及しています:

任意の値を使用してテーブルにインデックスを付けることができるため、配列のインデックスを任意の数で開始できます。ただし、Luaでは通常、配列を1で開始し(Cのように0ではなく)、いくつかの機能がこの規則に準拠しています。

後で、データ構造の章で、彼らは再びほぼ同じことを言います:Luaの組み込み機能は1ベースのインデックス付けを想定しています。

とにかく、1ベースのインデックス作成を使用するのに便利なcoupleがあります。つまり、#(長さ)演算子:t[#t]はテーブルの最後の(数値)インデックスにアクセスし、t[#t+1]は1 過去最後のインデックスにアクセスします。まだ0ベースのインデックス作成にさらされていない人にとって、#t+1はリストの最後を超えて移動する方が直感的です。また、Luaのfor i = 1,#tコンストラクトもあります。これは、「0から1を引いた長さ」をインデックス化するよりも「1から長さまで」を使用する方が賢明であるという以前のポイントと同じカテゴリーに該当すると思います。

しかし、0ベースのインデックス作成の考え方を破ることができない場合、Luaの1ベースのインデックス作成は確かに障害になる可能性があります。最終的に、著者はthem;そして、私は彼らの元のの目標が何であったか知らないことを認めますが、それはおそらくその後変更されました。

41
Mark Rushakoff

1から配列をカウントしない1つの非常に重要な理由があります。配列が0から始まる場合、それらを代数環として自然な方法で使用できます。例えば。曜日があります(day={'mo', 'tu', 'we'...)そして、それらを巡回したい。そうすれば、書くのはそれほど気になりません。

nextday = day[(i+1)%7]  as it is in almost every other language

より:

nextday = day[i%7+1] as it is in lua

最初はそれほど悪くはないようですが、逆に週をサイクルしてみてください。

またはより一般的には、インデックスセットにゼロがない場合、加算の中立要素がありません。インデックスの計算に必要なときはいつでも、インデックスをシフトする必要があります。

私は数学者ですが、プログラミングに関して言えば、ゼロからカウントするのがより良い選択肢であるという事実を受け入れました。

23
johannes_lalala

私の理解では、著者がそれを行うのに良い方法だと考えたからといって、そのようになっているのです。 (今日それを変更するなら、支払うべき地獄があると思う!)それ以上の特定の正当化を見たことがない。

14
dash-tom-bang

おそらくそれほど重要ではない点ですが、私がまだ言及したことは聞いていません:文字列の最初と最後の文字が0と-1ではなく、それぞれ1と-1にあるという事実により良い対称性があります。

5
VXZ

Luaライブラリは、1から始まるインデックスを使用することを好みますが、任意のインデックスを使用できます。 0を使用でき、1を使用でき、-5を使用できます。 ( https://www.lua.org/pil/11.1.html )にあるマニュアルにも記載されています。

実際、ここでクールなのは、内部luaライブラリが0を1として渡したものを扱うことです。 ipairsを使用するときは注意してください。
そのため:( "abc"):sub(0,1)== "a"および( "abc"):sub(1,1)== "a"はtrueになります。

 You can start an array at index 0, 1, or any other value:

-- creates an array with indices from -5 to 5
a = {}
for i=-5, 5 do
  a[i] = 0
end
1
user2262111

table [0]は常にnil(null)を返します。table[0] = 'some value'に値を割り当てない限り、table [0]はユーザーが割り当てた 'some value'を返します。

次に例を示します。

tbl={'some'}
print('tbl[0]='..tostring(tbl[0]))
print('tbl[1]='..tostring(tbl[1]))
nothing={}
print('nothing[0]='..tostring(nothing[0]))
print('nothing[1]='..tostring(nothing[1]))
nothing[0]='hey'
print('(after assign)\nnothing[0]='..tostring(nothing[0]))
1
BladeMight