Latest web development tutorials

루아 테이블 요소 (메타)

루아 테이블에서는 값을 얻기 위해 해당 키 값을 액세스 할 수 있지만,이 테이블에서 동작 될 수 없다.

따라서, 루아 테이블 요소 (메타)를 제공, 테이블은 우리가 해당 요소의 메소드와 연관된 각 작업의 동작을 변경할 수 있습니다.

예를 들어, 메타 테이블을 이용하여, 우리는 루아 테이블은 두 가지 작업 A + B의 합을 계산하는 방법을 정의 할 수있다.

루아 시도가 두 개의 테이블을 추가 할 때, 먼저라는 곳이 있는지 여부를 확인한 후 필드, 발견 된 경우, 해당 값을 호출 "__add"두 위안 테이블 중 하나가 있는지 확인합니다. "__add"및 기타 인스턴트 필드에 대응하는 값 (자주 함수 또는 테이블)는 "요소 방법"이다.

위안 테이블을 처리 할 수있는 매우 중요한 두 가지 기능이 있습니다 :

  • setmetatable (테이블, 메타) : 핵심 요소 테이블 (메타)에서이 __metatable 경우 지정된 테이블 요소 (메타)에 대한 테이블을 설정, 실패 setmetatable.
  • getmetatable (표) : 오브젝트 메타 데이터 테이블 (메타)를 돌려줍니다.

다음 예제에서는 지정된 테이블 요소에 대한 테이블을 설정하는 방법을 보여줍니다 :

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

위의 코드는 라인에 직접 기록 할 수 있습니다 :

mytable = setmetatable({},{})

다음은 리턴 오브젝트 메타 데이터 테이블입니다 :

getmetatable(mytable)                 -- 这回返回mymetatable

__index 요소 방법

이는 가장 일반적으로 사용되는 메타 핵심이다.

당신이 테이블에 액세스 할 수있는 키를 전달하고, 키 값이없는 경우, 다음 루아는 메타 테이블의 테이블을 찾을 때 __index 키에 (메타 가정). __index 테이블이 포함 된 경우, 루아는 테이블에서 해당 키를 찾을 수 있습니다.

우리는 대화 형 모드 뷰를 입력 루아 명령을 사용할 수 있습니다 :

$ 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 함수가 포함되어있는 경우, 다음, 루아는 그 함수, 테이블을 호출하고 키는 함수에 매개 변수로 전달됩니다.

그렇지 않으면, 결과를 리턴 존재 테이블 요소를 볼 __index 요소법 닐이며 그것은 __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 테이블에 키 1을 찾기가 발견되면, 계속 그 요소가 발견되지 않는 반환합니다.

  • MYTABLE 테이블의 키 2 찾기, 발견 된 경우, metatablevalue를 돌려, 계속 찾을 수 있습니다.

  • 메타 테이블을 분석하는 방법 __index가 함수 인 경우, 함수를 호출 어떠한 __index 방법이 없다.

  • 요소 방법은, 여부 들어오는 "키 2"매개 변수 키 (mytable.key2 세트)을 확인하기 위해 입력 "키 2"매개 변수를 반환 "metatablevalue", 그렇지 않으면 MYTABLE 해당 키의 경우.

우리는 위의 코드는 간단하다 쓸 수 있습니다 :

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

개요

실제로, 세 단계를 수행 할 때, 루아 룩업 테이블 요소 규칙 :

  • 테이블에서 찾기 1.하면, 발견 된 경우, 해당 요소를 찾을 수 없습니다를 돌려, 계속
  • 어떤 요소 테이블 반환 전무는, 거기에 계속 달러 테이블이없는 경우 테이블, RMB 테이블이 있는지 여부 2. 결정합니다.
  • __index 방법은 테이블 인 경우, 1,2,3를 반복; 3. 메타 테이블을 분석하는 것은 __index 방법은 전무 경우, 전무를 반환, 더 __index 방법이 없습니다 __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

새로운 인덱스 키 (newkey) 할당 (mytable.newkey = "새 값 2"), 할당하지 않고 요소 메소드를 호출 요소 방법 __newindex을 설정 위의 테이블의 예. 그리고 기존의 인덱스 키 (키 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"

테이블에 대한 연산자를 추가

다음 예제에서는 두 개의 테이블이 추가 작업을 보여줍니다

-- 计算表中最大值,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 요소 방법

루아 값을 호출 할 때 __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

이 문서에서 우리는 좋은 우리의 코드 기능을 단순화 할 수 있습니다 요소 테이블을 알고, 그래서 루아 메타 테이블을 이해하는 것은 우리가 간단 우수한 루아 코드를 작성할 수 있습니다.