루아 원표는 무엇입니까?
11801 단어 lua
1 function readOnly(t)
2 local proxy = {}
3 local mt = {
4 __index = t,
5 __newindex = function(t,k,v)
6 error("attempt to update a read-only table")
7 end
8 }
9 setmetatable(proxy,mt)
10 return proxy
11 end
12
13 days = readOnly{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
14 print(days[1])
15 days[2] = "Noday"
- 위의 읽기 전용 테이블의 실행 프로세스에 대한 설명
1: 우선readOnly라는 함수 호출에 대한 설명입니다. 이 호출은 다른 언어와 약간 다르며, 매개 변수는 괄호 안에 "함수 이름()"이 없습니다.
한 표의 구조식을 직접 따랐습니다. 프로그램 in lua 제5장 함수를 참고하십시오. 맨 처음 10문장:
하나의 함수가 하나의 매개 변수만 있고 이 매개 변수가 글자 문자열이나table 구조식이라면 괄호는 있어도 되고 없어도 된다.
days = readOnly{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
2:readOnly(t)의 인삼 t, 수신 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
그러면 t={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"에 해당합니다}
3: 바로localproxy={}는 국부적인 표이고 빈 표입니다. 원표는 mt입니다. setmetatatable(proxy, mt)라는 말 때문입니다.
그러니까 proxy.__index = mt. __index 이 필드는 루아가 테이블에 내장되어 있습니다.
4:returnproxy에 이어days=proxy에 해당합니다.proxy는 빈 테이블임을 기억하십시오
5:print(days[1])는 print(proxy[1])에 해당하지만 proxy[1]는 값이 없기 때문에 원표 mt를 찾고 mt도 mt[1]에 대응하는 값이 없기 때문에 __를 찾는다index 필드에 대응하는 값을 찾았습니다. 그래서 이전에 t가 받은 익명 원표를 찾았습니다. 그리고 Sunday를 출력했습니다. 익명 원표는 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}입니다.
6: 값을 지정할 때 5단계와 같이 __newindex, 그 값은 함수입니다. 그래서 실행했습니다.
error("attempt to update a read-only table”)
7: 위의 분석 과정은 바로 루아가 이 스크립트를 해석하는 과정이다. 우리는 자신이 함수를 썼는데 그 스크립트를 받아들일 때 위와 같이 이런 논리를 집행하고 이런 논리를 하나의 개념으로 정리하여 원표라고 부른다. 이것이 바로 원표의 편지이다.
8:그럼 왜 이러는 거예요?이 논리는 사실상 대상 언어에 대한 다태적 논리이다.단지 C++와 같은 언어는 위의 이러한 찾기 과정의 코드를 컴파일러에 의해 만들어질 뿐이다.다태는 상대적으로 계승적인 것이다. 즉, 부류 지침은 자류의 대상을 가리키며 실행할 때 발생하는 행위는 코드가 우리에게 주는 서면 논리와 일치하지 않는다.
9:lua는 원표를 통해 이미지 대상의 다태적 특성을 시뮬레이션한다.
-- 출력 결과:
--[[
Sunday
lua: d:/test.lua:6: attempt to update a read-only table
stack traceback:
[C]: in function 'error'
d:/test.lua:6: in function
d:/test.lua:15: in main chunk
[C]: ?
]]—
//--------------------- 다음은 프로그램 in 루아 제13장의 13.1 "산술류의 원 방법"-----------------------
코드에 인쇄 문장을 조금 넣으면 이해할 수 있고, 또한 for 문장을 절약한 부분을 완전하게 쓸 수 있다.이렇게 결과를 대조하면 흐리멍덩하지 않을 것이다.
초보자들에게 원판은 정말 좀 후덕하지 못하다.나는 N번을 보았다.비로소 알았다.그러나 절약은 값을 적게 돌려주고 코드를 적게 실행하여 효율을 높이기 위해서일 것이다.
Set = {}
local mt ={}
function Set.new (l)
local set = {}
setmetatable(set, mt)
for _, v in ipairs(l) do
print("<",_,">","(",v,")")
set[v] = true
end
return set
end
function Set.union(a,b)
local res = Set.new{}
for k ,v in pairs(a) do res[k] = true print(k,res[k]) end
for k ,v in pairs(b) do res[k] = true print(k,res[k]) end
return res
end
function Set.intersection (a,b)
local res = Set.new{}
for k in pairs(a) do
res[k] = b[k]
end
return res
end
function Set.tostring (set)
local l = {}
for e ,v in pairs(set) do
print(e,"|----|", v)
l[#l + 1] = e
end
return "{" .. table.concat(l,", ") .. "}"
end
function Set.print(s)
print(Set.tostring(s))
end
s1 = Set.new{10,20,30,40,}
s2 = Set.new{30,1}
print(getmetatable(s1))
print(getmetatable(s2))
mt.__add = Set.union
s3 = s1 +s2
print('-------')
print(s3)
print('-------')
Set.print(s3)
print(getmetatable(""))
for n in pairs(_G) do print(n) end
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Neovim을 위한 자동 완성NeoVim으로 생산성을 높일 수 있는 가장 멋진 기능 중 하나는 자동 완성이므로 성능에 따라 플러그인을 선택할 수 있습니다. YouCompleteMe Coc.nvim 이 플러그인은 사용하기 좋지만 Javascrip...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.