루아에서 별도로 생성 된 두 테이블은 "다르게"간주됩니다. 그러나 테이블을 한 번 만들면 원하는 모든 변수에 테이블을 할당 할 수 있으며, 테이블을 비교할 때 루아는 테이블이 동일하다는 것을 알려줍니다. 즉,
이렇게하면 간단하고 깨끗한 방법으로 원하는 것을 할 수 있습니다.어딘가에 key
을 저장하면 4
을 다시 검색 할 수 있습니다. 이것은 또한 매우 빠릅니다.
정말로을하고 싶지 않은 경우 ... 음, 방법이 있습니다. 그러나 그것은 비효율적이고 추악합니다.
첫 번째 부분은 두 개의 별도 테이블을 비교하는 함수를 만들고 있습니다. 2 개의 테이블이 「동등」인 경우는 true를 돌려 주어, 그렇지 않은 경우는 false를 돌려줍니다. 동급이라고 부르 자. 다음과 같이 작동해야합니다.
equivalent({a=1},{a=1}) -- true
equivalent({a=1,b=2}, {a=1}) -- false
equivalent({a={b=1}}, {a={b=2}}) -- false
테이블 자체가 포함 된 테이블을 처리하려면이 함수가 순환 적이어야합니다. 테이블 중 하나가 다른 테이블을 "포함"하지만 더 많은 요소가 있으면 테이블을 속일 수 없습니다. 나는이 구현으로 나왔다. 아마도 더 좋은 것들이있을 것입니다.
local function equivalent(a,b)
if type(a) ~= 'table' then return a == b end
local counta, countb = 0, 0
for k,va in pairs(a) do
if not equivalent(va, b[k]) then return false end
counta = counta + 1
end
for _,_ in pairs(b) do countb = countb + 1 end
return counta == countb
end
여기서는이 기능에 대해 설명하지 않겠습니다. 나는 그것이 무엇을하는지 분명히 밝혀지기를 바랍니다.
퍼즐의 다른 부분은 t
키를 비교할 때 equivalent
기능을 사용합니다. 이 작업은주의 깊은 메타 테이블 조작과 추가 "저장소"테이블을 사용하여 수행 할 수 있습니다.
우리는 기본적으로 t
을 사기범으로 변환합니다. 우리 코드가 키 아래에 값을 저장하라고 지시하면 코드 자체에 저장하지 않습니다. 대신 여분의 테이블에이를 제공합니다 (우리는 store
이라고 부를 것입니다). 코드에서 t
에 값을 묻는 경우 store
에서 코드를 검색하지만 equivalent
함수를 사용하여 값을 찾습니다.
local function equivalent(a,b)
... -- same code as before
end
local store = {} -- this is the table that stores the values
t = setmetatable({}, {
__newindex = store,
__index = function(tbl, key)
for k,v in pairs(store) do
if equivalent(k,key) then return v end
end
end
})
사용 예 :
이
코드입니다, 나는 언어 처리에 대해 많이 모르는
t[{a = 1}] = 4
print(t[{a = 1}]) -- 4
print(t[{a = 1, b = 2}]) -- nil
감사합니다 응답을. 내가 이것을 원한 이유는 NLP 작업이었습니다. 루아 표 (루아 표의 각 토큰은 table.insert를 사용하여 색인에 매핑되는 값으로 저장 됨)로 구를 추출하고 구의 빈도를 계산하려고합니다. 내가 원하는 것을 (예 : 문구를 연결하고 키로 연결된 문자열을 사용하는 등) 할 수있는 다른 방법이 있지만 추가 구현 단계가 필요하며 매우 깨끗하지는 않습니다. 당신이 자바에서 원하는 것을 할 수 있고, 루아를 처음 접한다면, 아날로그가 있는지 알아보기 위해 노력 중입니다. – akobre01
테이블이 가로 지르는 순서는 어떻게 달라지기 때문에 그러한 해시 함수는 작성하기가 어렵습니다. 그것은 생성 되었기 때문에 동일한 엔트리를 가진 테이블은 다른 횡단을 가질 수 있습니다. – lhf
그래서 내가 테이블에 키를 수집하고 일관된 키 순서를 보장하기 위해 그것을 정렬에 대해 말했다. –