[Guide] Lua Iteratoren

11/11/2015 21:16 rollback#1
Eine generische for Schleife:
Code:
for x in <function> do
--code
end
ruft für jeden Durchgang die <function> auf, bis diese nichts mehr zurückgibt.
Man kann sich also einen eigenen Iterator definieren, indem man diese Function zurückgibt.

Hier ein kleines Beispiel:
Code:
function range(i1, i2, increment)
	local from = i2 and i1 or 1
	local to = i2 and i2 or i1
	local increment = increment or 1
	
	local i = from - increment
	return function()
		i = i + increment
		if i < to then
			return i
		end
	end
end


for i in range(10, 20) do
	print(i)
end
Code:
> dofile("test.lua")
10
11
12
13
14
15
16
17
18
19
11/11/2015 21:19 DerZynx#2
Im Moment hast du nen Releasewahn. Find ich nice. :)
11/11/2015 21:29 Alekos#3
Hab dir gerne bei der Schleife geholfen, nettes Release :)
11/11/2015 22:19 [-Lee-]#4
[Only registered and activated users can see links. Click Here To Register...]

Mir fällt nichts anderes ein um dem RLS meine Bewunderung kund zu tun.
11/13/2015 16:22 Rofelmau#5
PHP Code:
function range(i1i2increment)
    
local from i2 and i1 or 1
    local to 
i2 and i2 or i1
    local increment 
increment or 1
    
    local i 
from increment
    
return function()
        
increment
        
if to then
            
return i
        end
    end
end


for i in range(1020) do
    print(
i)
end 
PHP Code:
for 1020 do
    print(
i)
end 
:confused:
11/13/2015 16:26 rollback#6
Quote:
Originally Posted by Rofelmau View Post
PHP Code:
function range(i1i2increment)
    
local from i2 and i1 or 1
    local to 
i2 and i2 or i1
    local increment 
increment or 1
    
    local i 
from increment
    
return function()
        
increment
        
if to then
            
return i
        end
    end
end


for i in range(1020) do
    print(
i)
end 
PHP Code:
for 1020 do
    print(
i)
end 
:confused:
Es geht ums Prinzip, wie Iteratoren in Lua funktionieren, nicht darum wie sinnvoll mein Beispiel ist.
Du kannst mit der Info aus diesem Thread auch viel komplexere Iteratoren basteln ;)
11/14/2015 16:19 He3o Crysis#7
Beispiel für einen komplexeren Iterator:

Code:
function fibonacci_iter(max_num)
    local before = -1
    local key = -1
    local curerent = 1
    return function()
        value = before + curerent
        if value > max_num then
            return nil, nil
        end
        before = curerent
        curerent = value
        key = key+1
        return key, value
    end
end

for k,v in fibonacci_iter(100) do
	print(string.format("key=%2d,  value=%2d", k, v))
end
Ausgabe:
Es handelt sich hierbei um die Fibonacci-Folge. (Die Summe zweier aufeinanderfolgender Zahlen ist immer die darauffolgende Zahl)

Es gilt immer F₀ = 0 und F₁ = 1!
Danach läuft das ganze nach Fₓ₊₁=Fₓ+Fₓ₋₁ //Gibt leider kein tiefgestelles Unicode n :eek:

Wieso ich das jetzt hier dazu geschrieben habe, weiß ich selber nicht ganz genau, jedoch sollte es zeigen, dass man doch mehr Zeugs mit Custom-Iteratoren anstellen kann als so mancher hier denkt.

Noch ein bisschen Offtopic am Ende:
[Only registered and activated users can see links. Click Here To Register...]
i cry every time. :(

Danke fürs Teilen Sensi!

- Crysis