Lua 교체기 및 범용 for

8971 단어 lua
1. 교체기와 closure
루아에서 교체기는 보통 함수이며, 매번 함수를 호출할 때마다 집합 중의 다음 요소를 되돌려줍니다.모든 교체기는 성공적으로 호출될 때 상태를 저장해야 한다.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 변수를 만들 필요가 없습니다.

좋은 웹페이지 즐겨찾기