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


125

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

その設計者が主題について言ったことを読むことは非常に興味深いでしょう。

私はLuaの「非常に」初心者であることに注意してください。


23
デフォルトのスコープもグローバルです。Luaの2つの最大の誤機能。
Yann Ramin、

37
私は1から始めることを誤った機能とは呼びません。それは実際にはもっと理にかなっています-プログラマーは、他の言語からの0ベースのインデックス付けに関して、私たちが好きではないことを考えるだけの十分な訓練を受けています。また、5/2 = 2と考えるように訓練されています。これは正しくありません。
BlueRaja-ダニープフルフフト

54
@ BlueRaja-DannyPflughoeft:いいえ。ゼロインデックスの方が理にかなっています。人間は1から数えることについて非常によく訓練されているため、0から始まる言語は最初は混乱します。ただし、ここでEdsger Dijkstraを紹介したいと思います。cs.utexas.edu
users

11
@nightcracker:あなたがテーブルの上にリンゴを数えるときは、「1」「2」などとしての第2の1として最初のものを数える 誰も「ゼロ」としてカウント最初のものをして、最後に1つずつ追加されます。ゼロから数えることは、議論の余地なく、直感に反しています。はい、これが内部でのインデックス作成のしくみですが、それが抽象化と呼ばれる理由です。
BlueRaja-ダニーPflughoeft 2013

9
0ベースのインデックス付けへの愛情をすべて理解したことはありません。オフセット(最初からスキップするアイテムの数は?)とサブシーケンス(0≤x <n)には適していますが、基本的なものには間違って見えます(2番目の要素は1と呼ばれますか?10番目の要素はインデックス9に対応していますか?WAT?) 。プログラマーでさえ、コンパイラーによって報告された行を見つけようとすると、1から数えます...
marcus

回答:


143

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

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


7
これは単に歴史的なマーケティング上の理由です。特に現時点では、合理的な理由はありません。そして、それを利用するのではなく、1ベースのインデックス付けを回避しようとしているように見えます:)
eonil

27
@Eonilは、明示的なインデックス作成を実際に回避することで、インデックス作成エラーを減らします。
Dan D.

8
@Eonilの歴史的な理由は通常、関連するものです。何かから始めて、それを変更することはできません。既存のコードがすべて壊れてしまうからです。特に、0と1のインデックス作成には適していません。壊れる方法がかなり微妙だからです。
CodesInChaos

5
1からLengthへの移行と0からLength -1への移行の違いは異なりますが、forループで< lengthは、「奇妙な0ベースの言語」の方がはるかに便利で読みやすくなっています。私は、ループが1から
繰り返さ

45

Luaでのプログラミングのテーブルの初議論、彼らが言及します:

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

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

とにかく、あるカップルの 1ベースのインデックスを使用する便利な。つまり、#(長さ)演算子:t[#t]テーブルの最後の(数値)インデックスにt[#t+1]アクセスし、最後のインデックスの1つ前にアクセスします。0ベースのインデックス付けをまだ行っていない人にとっては#t+1、リストの最後を越えて移動する方が直感的です。Luaのfor i = 1,#t構成もあり、「1から長さ」は「0から長さ-1」にインデックスを付けるよりも賢明であるという前のポイントと同じカテゴリに分類されます。

ただし、0ベースのインデックス付けの考え方を壊すことができない場合は、Luaの1ベースのインデックス付けは確かに妨げになります。結局、著者たちは彼らのために働く何かを望んだ。そして、私は彼らの元の目標が何であったかわからないことを認めますが、それはおそらくそれ以来変更されています。


16

私が理解しているのは、著者がそれを行うには良い方法だと思ったからであり、言語を一般に公開した後、決定はかなり石灰化したということです。(彼らが今日それを変更するならば、支払うべき地獄があるだろうと思います!)それ以上の特定の正当化を見たことがありません。


6
正当化の可能性:配列は基本的に単なるポインタとarray[0] == array + 0;であり、配列が実際にハッシュテーブルである場合、1ベースのカウントがより自然であるため、Cはそれを行いました。
Maygarden裁判官、2010年

19
Luaインデックスは実際にはインデックスです。Cでインデックスと言うとき、あなたが本当に意味しているのはオフセットです。
Alex

8

おそらくそれほど重要ではないかもしれませんが、まだ言及されていない点です。文字列の最初と最後の文字が0と-1ではなく、それぞれ1と-1であるという点で、より対称性があります。


8
これはすばらしいことですが、1から開始する理由にはなりませんでし
lhf

3

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

実際、ここでクールなのは、内部のluaライブラリーがいくつかの渡された0を1として扱うことです。ipairsを使用するときは注意が必要です。
だからそれ("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"は本当でしょう。

 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

({'a', 'b'})[1]評価し'b'ないようにする方法はあり'a'ますか?それは私には内蔵されているようです。
レムラム

1
({[0] = 'a', 'b'})[1]
user2262111

0

本当の理由は、言語がポルトガルの法律の定義の実装であり、主要な開発センターはブラジルにあったため、インデックスまたは添え字としてゼロまたは空または何も使用しないことを好むためです。ただし、言語によっては、一部のバージョンのテーブル作成関数で1以外の開始インデックスを使用できます。


5
これが真実であっても、Luaの設計方法にはまったく関係ありません。
lhf 2013

-1

table [0]は、自分で値を割り当てない限り、常にnil(null)を返しますtable [0] = 'some value'そしてtable [0]は、YOUが割り当てた '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]))

-11

それはすべての人にとって理にかなっています

table = {}

現時点でtableは空です。そうするとき

table == {something}

テーブルには何かが含まれているので、そのtable意味がわかっている場合は、インデックス1になります。

私が意味したのは、そのテーブル[0]が存在し、そのテーブル= {}が空であるため、プログラマーは空のテーブルを呼び出さず、それらを設定してから埋め、空を見つけるのは無意味です。テーブルを呼び出すたびに、空のテーブルを作成する方が簡単です。

私の英語は上達しません、そしてそれは私の最高の文法です。気に入らない場合は、自由に読み続けてもかまいませんが、助けようとする人に-repを与えると、特に文法のような場合には、人はまったく助けたくないでしょう。私は文法ではなく、数字と変数の人です。ごめんなさい。


4
テーブルの値が0であるという概念がわかりません。テーブルの長さは0にすることができます。しかし、それは最初のインデックスの選択とは無関係です。ちょっとした文法の間違いは気にしませんが、あなたの答えの意味がわからないので、私は反対票を投じました。
CodesInChaos

つまり、テーブルは0のインデックスまたは値で保持できません。これは、空のテーブル<、<として使用するためです。何かについて、私たちはセロに私たちを導きます、しかしセロは数を数えます、ルアは実用的になるその言語です、あなたは外に出ず、友達にあなたが私にそのアーティストの0曲があるか、あなたがいくつか持っているか、あなたが知っているかを知らせませんいけない。ポイントそのテーブル= {} thats cero空のテーブル
Wesker

5
0要素のみとしてインデックスを使用する配列はまだ空ではありません。実際、luaはこれをサポートしています。これはデフォルトの規則ではありません。
CodesInChaos

うん、私はあなたに同意しますが、他の言語ではluaではなく、luaインデックス0が存在しないので、空の= 0のように想像できます。つまり、インデックスを強制的に0にすることができたとしても、それはテーブル値で動作しません#tableは0インデックスを読み取らないので、私の答えは基本的に通常のイベントのように作成されたルアですが、これが意図するものかどうかに関係なく、ホールコードを再度記述しないでください。我々はそれについて何もすることができません:/、私はまだluaで空のテーブルが0インデックスを持っていると言うのが公正だと信じています
Wesker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.