루아 원표는 무엇입니까?

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  

좋은 웹페이지 즐겨찾기