2017-06-01 9 views
1

私はこのように、別のテーブルの機能が含まれているテーブルを作成したい:method_map[1][2]():これで私はこのような機能の一つを呼び出すことができ、その後Luaでメソッドのマップを作成するにはどうすればよいですか?

party_animal = {} 

function party_animal:dance() 
    -- dance 
end 

function party_animal:dance_furiously() 
    -- extreme dance 
end 

method_map = { 
    'idea_one': party_animal:dance, 
    'idea_two': party_animal:dance_furiously, 
} 

:の代わりに.演算子を使用すると、これを実行できますが、selfへのアクセスを希望します。

私が手にエラーがこれです:意図したとおりに

stdin:2: '}' expected (to close '{' at line 1) near ':' 
+0

method_mapを呼び出す場合

今自己party_animalを参照します[1] [2]。 method_map [1]はnilなので、method_map [2]にインデックスを付けることはできません。 method_map [1]がテーブルであっても、method_map [1] [2]はnilになり、nil値を呼び出すこともできません。 – Piglet

+0

これは私がテーブルの構文が間違っているためですか? – Matt

+1

@MattDeacalionStevensいいえ、これは、テーブルを作成するときに文字列キーを使用し、番号付きのキーで値にアクセスしようとするためです。 'table [1]'は 'table [1] = foo'または' table = {foo} 'で定義されたキーにアクセスしようとします。要するに '{}'でキーを省略すると、すべての値は* 1 *から始まる数字で索引付けされます。 'table = {" a "、" b "、" c "}'は 'table [1] ==" a "'になります。 – Green

答えて

4

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

+1

最後の例は、 'method_map = {idea_one = function()return party_animal:dance()end}'に変更することができます。 – nobody

+0

@無名:ああ、もちろんええ。私はオプションの構文的な砂糖のバージョンを追加しました – Piglet

4
party_animal = {} 

function party_animal:dance() 
    -- dance 
end 

function party_animal:dance_furiously() 
    -- extreme dance 
end 

method_map = { 
    idea_one = party_animal.dance, 
    idea_two = party_animal.dance_furiously, 
} 

これは動作します。どうして?

まず、テーブル本体がlua構文に一致するように変更されていることに注意してください。あなたが持っているエラーは、非常に詳細な方法でピグレットによって指摘された無効なテーブル定義によって引き起こされます。

第二に、機能

function table:foo() end 

のこの定義は、そのパラメータを変更しないこれ

function table.foo(self) end 

渡す関数リファレンスと同じです。最初のパラメータはまだselfになり、:を使用してこの関数を呼び出すと、method_mapselfとして渡されます。

method_map = { 
    idea_one = function (...) return party_animal.dance(party_animal, ...) end, 
    idea_two = function (...) return party_animal.dance_furiously(party_animal, ...) end, 
} 

Lua 5.3 Reference Manual on function defining and calling:あなたは追加機能を使用する必要がありますmethod_mapからの機能でselfとしてparty_animalを持つようにしたい場合は

+0

彼は自己を通してparty_animalにアクセスしたいと思う。あなたの例では、selfはmethod_mapを参照します。また、テーブルをテーブル名として使用することは、Luasの標準テーブル操作ライブラリを提供するために既に使用されているので、あまりうまくありません。 – Piglet

+0

@ピグレット私はそれとは違って理解しています。 ':'を使わないで関数を渡すと、 'self'にアクセスすることができなくなるのではないかと心配しています。まあ私は彼を待つべきだと思う。 – Green

+0

ありがとう、これらの完全な説明は素晴らしかった!そして、どちらかというと少し、私はコールバックとしてテーブルの値を渡したいと思ったが、私は関数が '自己'にアクセスすることを望んでいた...私は ':'演算子がこれをしたと理解したが、働く@ピグレットの答えの終わりにスポットがあった! – Matt

関連する問題