2017-11-20 10 views
3

私は、次の構文を達成するために、いくつかのLuaのデータ構造を実装したいと思います:ルアのネストされたインデックス:a ['0']。b ['0']?

  1. units - >は、ユニットのテーブルを返します。
  2. units[0] - >は数値を返します。
  3. units[0].properties - >は、プロパティのテーブルを返します。
  4. units[0].properties[0] - >はユニット[0]のプロパティを返します。これは数値でもあります。

最初の2つの手順は、インデックス付きのテーブルを使用すると簡単です。 しかし、4つの要件をすべて同時に達成することはできますか?

unitsをカスタマイズした__indexメタメソッドで作成することを考えていました。それは正しい方向ですか?

+0

プリミティブ型は、プリミティブ型とは何ですか? –

+0

すべての 'units [k]'は '__index'メタメソッドを持つべきです。 –

+0

@NicolBolas私はブール値、数値、文字列を意味します:)おそらく単なる数値です。 – TangKe

答えて

0

一つは(debug.setmetatableを経由して)すべての数値のためのメタテーブルを設定し、プロパティを解決するために__indexメタメソッドを使用することができます。

local properties_by_nums = { 
    {42}, 
    {23}, 
} 

local num_mt = { 
    __index = function(n, i) 
    if i == 'properties' then 
     return properties_by_nums[n] 
    end 
    return nil 
    end 
} 

debug.setmetatable(0, num_mt) 

units = {1, 5} 

print(type(units))           -- table 
print(units[1], type(units[1]))        -- 1, number 
print(type(units[1].properties))       -- table 
print(units[1].properties[1], type(units[1].properties[1])) -- 42, table 

(おそらくクリーナー)の代替がテーブルとしてあなたのユニットの値を定義することですは数字のように振る舞います。これは、メタメソッド__add,__mulなどを実装することで実現できます。

+0

のように動作します。私が理解できない1つの理由は、units [1] .propertiesがテーブルである理由です。このシナリオで__indexメタメソッドはどのように機能しますか? – TangKe

+0

私はメタテーブルを使う必要がないので、通常のテーブル( 'properties_by_nums'の' {42} ')として' units [1] .properties'を残しました。数字の '__index'メタメソッドは、与えられた数字とルックアップされるべきインデックスという2つの引数をとります。唯一のフィールドは 'properties'です。実際のプロパティは、property_by_numsの中で、探しているプロパティの番号のインデックスを使って検索されます。それは理にかなっていますか? – tarleb

関連する問題