2011-06-27 4 views
1

にピリオドを使用してテーブルのキーを使用して:おそらく次のように行くかもしれない指定されたキーを持つテーブルを割り当て、LuaのではLuaの

a = { x = 4 } 

...など...十分

a = { ['x'] = 4 } 

簡単。しかし、キーにピリオドを導入すると(ドメイン名のように)何も動作しないようです。以下のすべてが失敗する:

a = { "a.b.c" = 4 } 
a = { a.b.c = 4 } 
a = { ['a.b.c'] = 4 } 
a = { ["a.b.c"] = 4 } 
a = { [a.b.c] = 4 } 

これらのすべては、同じエラーを返す:

$ ./script.lua 
/usr/bin/lua: ./script.lua:49: `}' expected near `=' 

私はここで何をしないのですか?いくつかの例はかなり単純明快に見え、うまくいくはずです(明らかに問題があるものもあります)。

+0

少なくとも2つの例がLuaで動作するはずです。 ({['a.b.c'] = 4} と{["a.b.c"] = 4})。 – kikito

答えて

3

luaテーブルの要素には、名前または式のいずれかを指定できます。言語リファレンスを引用すると、 "Luaの名前(識別子とも呼ばれます)は数字、数字、およびアンダースコアの任意の文字列で、数字で始まるものではありません"、その他はすべてこのコンテキストで識別子として解釈されます。したがって、テーブルインデックスとしてのa.b.cは、実際のテーブルインデックスを取得するために評価される式として扱われます。これは動作しますが、無用のようになります。

a = { b = { c = 1 } } 
x = {} 
x['a.b.c'] = 7 

print(x['a.b.c']) 

またfoo.a.b.cfoo['a']['b']['c']としないようにfoo['a.b.c']に等しいことを、注意してください。

+0

もう一つのポスターが頭の中の問題を打ちました - _ "あなたのスクリプトに何か間違っていますか?" _ - しかし、これは最も完全な答えです。どういうわけか、上記のような例文を得る際に、何かが壊れました。答えは '' "a.b.c.d"] 'と' 'a.b.c.d '''はテーブルキーとしての文字列リテラルであり、 '[a.b.c.d]'はテーブルキーとしての値 'a.b.c.d'です。 – Mei

1

スクリプトに何か間違いがありますか?

$ ./lua 
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio 
> a = { ["a.b.c"] = 4 } 
> print (a["a.b.c"]) 
4 
> print (a.a) 
nil 
2
a = { ['a.b.c'] = 4 } 
a = { ["a.b.c"] = 4 } 

これら二つは、すべて有効です。

a = { [a.b.c] = 4 } 

この使用される正確な識別子に応じて、有効である可能性があります。たとえば、

b = { c = { d = "Ohai!" } } } 
a = { [b.c.d] = 4 } 

が有効です。

あなたの通訳者があなたに妥当ではないと言っている場合は、何か間違ったことをしたか、通訳者にバグがあります。しかし他は有効ではないでしょう。

関連する問題