Luaのリファレンスマニュアルから:https://www.lua.org/manual/5.3/manual.html#3.4.9
表のコンストラクタはテーブルを作成する式です。 コンストラクタが評価されるたびに、新しいテーブルが作成されます。コンストラクタは、空のテーブルを作成するために、またはテーブルを作成し、フィールドの一部を に初期化するために使用される です。コンストラクタのための一般的な構文は
tableconstructor ::= ‘{’ [fieldlist] ‘}’
fieldlist ::= field {fieldsep field} [fieldsep]
field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
fieldsep ::= ‘,’ | ‘;’
ある形[EXP1] = EXP2の各フィールドは、新しいテーブルにキーEXP1とEXP2値を持つエントリ を追加します。 name = expという形式のフィールドは、["name"] = expに相当する です。最後に、exp形式のフィールドは、[i] = expと等価な です。ここで、iは から1を始める連続する整数です。他の形式のフィールドは、このカウントに影響しません。テーブルのコンストラクタのためにその有効でない構文ので
あなたは
method_map = {'idea_one' : party_animal:dance}
のようなものを見るようにすることはできません。
=を置換し、 ''を削除して有効な式にします。
method_map = {idea_one = party_animal:ダンス}エラーメッセージを
STDINを回避するであろう:2: '}' 期待(閉じ '{' 1行目)周辺 ':'
しかし、関数の引数が見つからないという別のエラーメッセージが表示されます。
これは、コロン演算子が関数呼び出しと定義に対してのみ有効であるためです。あなたが実際にやりたいテーブル要素をインデックス化するためのものではありません。
method_map = {idea_one = party_animal.dance}
は間違いを起こさせません。
もちろん、あなたは自己を通してparty_animalにアクセスすることはできません。
これをどのように達成できますか? method_map:dance()
を呼び出すと、method_mapが自己参照されます。
しかし、我々はコロン演算子、 で糖衣構文を使用して
method_map = {idea_one = function() return party_animal:dance() end}
method_map = {idea_one = function() return party_animal.dance(party_animal) end}
または同等
を書く場合、我々は最終的に私たちが望むものを手に入れます。我々は
method_map:dance()
method_mapを呼び出す場合
今自己party_animalを参照します[1] [2]。 method_map [1]はnilなので、method_map [2]にインデックスを付けることはできません。 method_map [1]がテーブルであっても、method_map [1] [2]はnilになり、nil値を呼び出すこともできません。 – Piglet
これは私がテーブルの構文が間違っているためですか? – Matt
@MattDeacalionStevensいいえ、これは、テーブルを作成するときに文字列キーを使用し、番号付きのキーで値にアクセスしようとするためです。 'table [1]'は 'table [1] = foo'または' table = {foo} 'で定義されたキーにアクセスしようとします。要するに '{}'でキーを省略すると、すべての値は* 1 *から始まる数字で索引付けされます。 'table = {" a "、" b "、" c "}'は 'table [1] ==" a "'になります。 – Green