なぜLUAアレイ(テーブル)が0ではなく1から始まるのですか?

StackOverflow https://stackoverflow.com/questions/2785704

  •  03-10-2019
  •  | 
  •  

質問

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

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

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

役に立ちましたか?

解決

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

私も最初は奇妙に感じましたが、0ベースのアレイを愛することを学びました。しかし、特にLuaのジェネリックを使用して、Luaの1ベースのアレイでOKを取得します for ループと ipairs オペレーター - 通常、配列がどのようにインデックス化されているかについて心配することを避けることができます。

他のヒント

ルアでのプログラミングテーブルの最初の議論、彼らは次のように言及しています。

任意の値でテーブルにインデックスを付けることができるので、あなたを喜ばせる任意の数字で配列のインデックスを開始できます。ただし、LUAでは1(Cのように0ではなく)でアレイを開始することが慣習的であり、いくつかの施設はこの慣習に固執しています。

その後、データ構造に関する章で、彼らはもう一度ほぼ同じことを言います。Luaの組み込み施設は1ベースのインデックスを想定しています。

とにかく、aがあります カップル 1ベースのインデックス作成を使用するための便利さ。すなわち、 # (長さ)オペレーター: t[#t] テーブルの最後(数値)インデックスにアクセスし、 t[#t+1] アクセス1 過去 最後のインデックス。まだ0ベースのインデックスにさらされていない人に、 #t+1 リストの終わりを超えて移動する方が直感的です。ルアもあります for i = 1,#t コンストラクトは、「長さまで」「長さ1」のインデックスを取得するよりも賢明である可能性があるという前のポイントと同じカテゴリに該当すると思います。

しかし、0ベースのインデックス作成の考え方を破ることができない場合、Luaの1ベースのインデックスは確かに妨げになる可能性があります。最終的に、著者は働く何かを望んでいました 彼ら;そして、私は彼らの何がわからないことを認めます オリジナル 目標はそうでしたが、それ以来、おそらく変更されています。

1からアレイをカウントしないという非常に重要な理由が1つあります。アレイがゼロから始まる場合、それらを自然な方法で代数リングとして使用できます。たとえば、1週間の日があります(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

最初はそれほど悪くはないようですが、週を繰り返しサイクリングしようとします。

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

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

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

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

テーブル[0]を自分で割り当てない限り、表[0]は常にnil(null)を返します。

ここに例:

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]))

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以外のスタートインデックスを使用することができます。

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

table = {}

この時点で、 table 空です。そうするとき

table == {something}

テーブルには何かが含まれているので、それに含まれるのはインデックス1です table お分かりでしょうが。

私が意味したのは、そのテーブル[0]が存在し、そのテーブル= {}は空です。現在、プログラマーは空のテーブルを呼び出したり、設定したり、それを満たしたりして、空を見つけるのは役に立たないでしょうテーブルに電話するたびにテーブルがあるので、空のテーブルを作成する方が簡単です。

私の英語は良くなることはありません、そしてそれは私の最高の文法です。気に入らない場合は、自由に読み続けることはできませんが、特に文法のようなもののために、人々がまったく助けたくない人を助けようとする人に繰り返しを与えることができます。私は文法ではなく、数字とvarsの男です。ごめん。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top