151

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

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

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

4

9 に答える 9

179

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

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

于 2010-05-07T02:42:34.650 に答える
52

Luaのテーブルに関する最初の議論で、彼らは次のように述べています。

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

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

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

しかし、0ベースのインデックス作成の考え方を破ることができない場合、Luaの1ベースのインデックス作成は確かにもっと邪魔になる可能性があります。最終的に、著者は彼らのために働く何かを望んでいました; 彼らの当初の目標が何であったかはわかりませんが、それ以降はおそらく変更されています。

于 2010-05-07T02:15:32.820 に答える
17

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

于 2010-05-07T01:58:33.807 に答える
10

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

于 2012-08-06T09:05:47.277 に答える
2

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
于 2017-12-22T11:38:51.590 に答える
2

CとLuaの配列インデックスの特定の定義は異なります。

C配列では、次のことを意味します。配列アドレスのアイテムアドレスオフセット

Lua配列では、次のことを意味します。配列のn番目の項目

ほとんどの言語が0ベースのインデックスを使用するのはなぜですか?のコンパイラコードoffset definitionはより便利で効果的だからです。それらは主にアドレスを処理します。

そしてルア。これは、Cを使用したテーブルインデックスのlua5.3.5のコードです。

const TValue *luaH_getint (Table *t, lua_Integer key) {
  if (l_castS2U(key) - 1 < t->sizearray)
    return &t->array[key - 1];
  else {
    Node *n = hashint(t, key);
    for (;;) {
      if (ttisinteger(gkey(n)) && ivalue(gkey(n)) == key)
        return gval(n);
      else {
        int nx = gnext(n);
        if (nx == 0) break;
        n += nx;
      }
    }
    return luaO_nilobject;
  }
}

コードに焦点を当てる必要&t->array[key - 1]があります。減算演算があります。0ベースのインデックスと比較して効果的ではありません。

しかし、1ベースのインデックスは人間の言語に近いです。英語、中国語、日本語などのn番目の項目に重点を置いています。

したがって、Luaの設計者は、1ベースのインデックスを選択し、純粋に新しいプログラムを簡単に理解できるように選択し、利便性と有効性を放棄すると思います。

于 2021-02-03T10:59:11.367 に答える
0

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

于 2010-11-24T14:18:15.837 に答える
-1

あなたの例では、のように自分で値を割り当てない限り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]))
于 2016-11-07T09:12:30.333 に答える
-13

誰にとっても理にかなっています

table = {}

table空です。そうするとき

table == {something}

テーブルには何かが含まれているのでtable、私が何を意味するか知っているなら、そこに含まれているのはインデックス1です。

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

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

于 2011-12-06T09:12:30.607 に答える