Latest web development tutorials

Luaのテーブル要素(メタテーブル)

Luaのテーブルでは、値を取得するには、対応するキーの値にアクセスすることができますが、それは2テーブルの上に動作させることはできません。

したがって、Luaがテーブル要素(メタテーブル)を提供し、テーブルには、私たちは、対応する要素法に関連した各アクションの動作を変更することができます。

例えば、メタテーブルを用いて、我々は、Luaのテーブルは、2つの操作+ bの和を計算する方法を定義することができます。

Luaの試みは2つのテーブルを追加する場合は、最初と呼ばれる場所があるかどうかを確認した後、フィールド、見つかった場合は、対応する値を呼び出す "__add"、2元表の1があるかどうかを確認してください。 "__add"そして、他のインスタントフィールド、対応する値(多くの場合、関数またはテーブル)」要素法」です。

元のテーブルを処理するために2つの非常に重要な機能があります。

  • setmetatable(テーブル、メタテーブル):指定されたテーブル要素(メタテーブル)のテーブルを設定し、そこに__metatable鍵要素テーブル(メタテーブル)であれば、失敗setmetatable。
  • getmetatable(表):オブジェクト・メタデータ・テーブル(メタテーブル)を返します。

次の例では、指定したテーブル要素のテーブルを設定する方法を示しています。

mytable = {}                          -- 普通表 
mymetatable = {}                      -- 元表
setmetatable(mytable,mymetatable)     -- 把 mymetatable 设为 mytable 的元表 

上記のコードは、行に直接書き込むことができます。

mytable = setmetatable({},{})

以下は、リターン・オブジェクトのメタデータ表のとおりです。

getmetatable(mytable)                 -- 这回返回mymetatable

__index要素法

これは、最も一般的に使用されるメタテーブルのキーです。

あなたがテーブルにアクセスするためのキーを渡すと、キーに値がない場合は、Luaは__indexキーに(メタテーブルを想定)メタテーブルのテーブルがあります。 __indexは、テーブルが含まれている場合は、Luaはテーブル内の対応するキーを検索します。

私たちは、対話モード・ビューを入力するのluaコマンドを使用することができます。

$ lua
Lua 5.3.0  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> other = { foo = 3 } 
> t = setmetatable({}, { __index = other }) 
> t.foo
3
> t.bar
nil

__indexが関数が含まれている場合は、その後、Luaがその関数を呼び出します、テーブルとキーは関数にパラメータとして渡されます。

テーブル要素が存在するビュー、そうでない場合は、結果を返すために__index要素法はnilであり、それは__index戻り結果によって存在している場合。

mytable = setmetatable({key1 = "value1"}, {
  __index = function(mytable, key)
    if key == "key2" then
      return "metatablevalue"
    else
      return nil
    end
  end
})

print(mytable.key1,mytable.key2)

出力の例は次のとおりです。

value1	metatablevalue

分析の例:

  • mytableはテーブル割り当てられた{キー1 = "値1"}。

  • mytableはセットのメタテーブル要素法__index。

  • mytableは表にKEY1を検索、見つかった場合、その要素を返し続け、見つけることができません。

  • mytableはテーブル内のキー2を検索し、見つかった場合は、metatablevalueを返し、続け見つけます。

  • メタテーブルを分析すること__index方法が関数の場合、関数を呼び出す、全く__index方法がありません。

  • 着信「キー2」パラメータが戻る "metatablevalue」場合、着信「キー2」パラメータキー(mytable.key2セット)かどうかそうでない場合はmytableは、対応するキーを確認する要素法。

私たちは、上記のコードは単純です書くことができます。

mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } })
print(mytable.key1,mytable.key2)

サマリー

Luaのルックアップは、実際には、ときに、次の3つの手順をtable要素をルール:

  • 1.見つかった場合は、テーブル内の検索その要素を返し、見つからない、継続
  • 2.継続的なドルのテーブルがあり、nilを返し、どの要素テーブルが存在しない場合、テーブルは、人民元のテーブルを持っているかどうかを判断します。
  • 3.メタテーブルを分析すること__index方法がnilであれば、何の__indexメソッドを持っていない、nilを返します。__index方法はテーブルの場合は、1,2,3を繰り返し、__index方法が関数の場合、関数の戻りを値を返します。

__newindex要素法

__newindex要素法は、テーブルを更新するために使用され、__インデックスは、テーブルにアクセスするために使用されます。

あなたが不足しているインデックステーブルの割り当てを与えるときは、インタプリタは__newindex要素法を見ていきます:あなたは割り当てなしでこの関数を呼び出した場合。

次の例では、アプリケーション__newindex要素法を示しています。

mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })

print(mytable.key1)

mytable.newkey = "新值2"
print(mytable.newkey,mymetatable.newkey)

mytable.key1 = "新值1"
print(mytable.key1,mymetatable.key1)

上記の出力の実装の例としては、次のとおりです。

value1
nil	新值2
新值1	nil

要素法__newindexを設定上記の表の例として、ときに新しいインデックスキー(NEWKEY)代入(mytable.newkey = "新しい値2」)は、割り当てなしの要素のメソッドを呼び出します。 既存のインデックスキー(キー1)場合、要素法の__newindexを呼び出さず、割り当てを行います。

次の例では、表を更新するrawset機能を使用しています。

mytable = setmetatable({key1 = "value1"}, {
  __newindex = function(mytable, key, value)
		rawset(mytable, key, "\""..value.."\"")

  end
})

mytable.key1 = "new value"
mytable.key2 = 4

print(mytable.key1,mytable.key2)

上記の出力の実装の例としては、次のとおりです。

new value	"4"

テーブルの演算子を追加します。

次の例では、2つのテーブルの追加操作を示しています。

-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用
-- 自定义计算表中最大值函数 table_maxn
function table_maxn(t)
    local mn = 0
    for k, v in pairs(t) do
        if mn < k then
            mn = k
        end
    end
    return mn
end

-- 两表相加操作
mytable = setmetatable({ 1, 2, 3 }, {
  __add = function(mytable, newtable)
    for i = 1, table_maxn(newtable) do
      table.insert(mytable, table_maxn(mytable)+1,newtable[i])
    end
    return mytable
  end
})

secondtable = {4,5,6}

mytable = mytable + secondtable
	for k,v in ipairs(mytable) do
print(k,v)
end

上記の出力の実装の例としては、次のとおりです。

1	1
2	2
3	3
4	4
5	5
6	6

表に含まれる重要な要素を__add、および操作を追加します。 次の表に対応するアクションのリスト:

モード 説明
__add 対応するオペレータ '+'。
__sub 対応するオペレータ ' - '。
__mul 対応するオペレータ '*'。
__div 対応するオペレータ '/'。
__mod 対応するオペレータ '%'。
__unm 対応するオペレータ ' - '。
__concat 対応するオペレータ '..'。
__eq 対応するオペレータ '=='。
__lt 対応するオペレータ '<'。
__le 対応するオペレータ '<='。

__call要素法

Luaが値を呼び出したときに__call要素メソッドが呼び出されます。 次の例では、要素の計算テーブルを示し、そして:

-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用
-- 自定义计算表中最大值函数 table_maxn
function table_maxn(t)
    local mn = 0
    for k, v in pairs(t) do
        if mn < k then
            mn = k
        end
    end
    return mn
end

-- 定义元方法__call
mytable = setmetatable({10}, {
  __call = function(mytable, newtable)
	sum = 0
	for i = 1, table_maxn(mytable) do
		sum = sum + mytable[i]
	end
    for i = 1, table_maxn(newtable) do
		sum = sum + newtable[i]
	end
	return sum
  end
})
newtable = {10,20,30}
print(mytable(newtable))

上記の出力の実装の例としては、次のとおりです。

70

__toString要素法

__toString要素法は、出力テーブルの動作を変更するために使用されます。 コンテンツの当社のカスタム出力テーブルの例を示します。

mytable = setmetatable({ 10, 20, 30 }, {
  __tostring = function(mytable)
    sum = 0
    for k, v in pairs(mytable) do
		sum = sum + v
	end
    return "表所有元素的和为 " .. sum
  end
})
print(mytable)

上記の出力の実装の例としては、次のとおりです。

表所有元素的和为 60

この記事から、我々は良いが、私たちのコードの機能を簡素化することが可能な素子のテーブルを知っているので、Luaのメタテーブルを理解することは、私たちは単純な優れたLuaのコードを記述することができますすることができます。