Lua 교체기 및 범용 for
8971 단어 lua
루아에서 교체기는 보통 함수이며, 매번 함수를 호출할 때마다 집합 중의 다음 요소를 되돌려줍니다.모든 교체기는 성공적으로 호출될 때 상태를 저장해야 한다.closure(패키지 닫기)는 교체기 운용에 완벽하다.
function values(t)
local i=0
return function() --
i=i+1
return t[i]
end
end
t1 ={10, 20, 30}
it=values(t1) --
while true do
local element=it() --
if(element==nil) then break
end
print(element)
end
t2={11,22,33}
for v in values(t2) do
print(v)
end
--
--10
--20
--30
--11
--22
--33
위의 예에서 알 수 있듯이 모델 for는while에 비해 우리에게 더욱 뚜렷한 실현 논리를 제공했다.루오의 내부 함수는 이미 우리에게 교체 함수를 제공했습니다.foreach를 실행할 때 은밀한 교체기를 호출합니다.
2. 범용 for의 의미
위의 교체기는 뚜렷한 단점이 하나 있다. 매번 순환할 때마다 새로운closure 변수를 만들어야 한다는 것이다. 이전에 이미 만든closure 변수를 운용할 수 없다. 만약에 내가 이 순환 외에 순환을 하나 더 추가하여 교체할 때 이것은 매우 번거롭고 오류가 발생하기 쉬운 문제가 된다.
아래에 나타난 교체기는 이 문제를 잘 해결했기 때문에 매번의 범용 for에 새로운closure 변수를 만들 필요가 없습니다.
function iter(a,i)
i=i+1
if a[i]==nil then return nil,nil
else return i,a[i]
end
end
function ipairs(a)
return iter,a,0 --iter ,
end
a={"one","two","three"}
for i,v in ipairs(a) do
print(i,v)
end
-- for while
do
local _it,_s,_k=ipairs(a)
while true do
k,v=_it(_s,_k)
_k=k
if k==nil then break end
print(k,v)
end
end
--
--1 one
--2 two
--3 three
--1 one
--2 two
--3 three
3. 무상태 교체기
function getnext(list,node)
if not node then return list
else return node.next
end
end
function traverse(list)
return getnext,list,nil
end
list=nil
for line in io.lines() do
list={next=list, value=line}
end
for node in traverse(list) do
print(node.value)
end
--
--a
--b
--c
--
--c
--b
--a
위의 예를 통해 알 수 있듯이list 변수와traverse 함수를 무한히 사용할 수 있으며 첫 번째 상황처럼 매번 순환하기 전에 새로운closure 변수를 만들 필요가 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Neovim을 위한 자동 완성NeoVim으로 생산성을 높일 수 있는 가장 멋진 기능 중 하나는 자동 완성이므로 성능에 따라 플러그인을 선택할 수 있습니다. YouCompleteMe Coc.nvim 이 플러그인은 사용하기 좋지만 Javascrip...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.