老版本的Lua不支持for语句, 可以在函数中写循环来达到循环的目的.
以下是书上的例子, 显然函数里面用了for, 所以有点毛病.
> function allwords(f)
>> for line in io.lines() do
>> for word in string.gmatch(line, "%w+") do
>> f(word)
>> end
>> end
>> end
-- 调用allwords函数, 使用print函数打印单词
> allwords(print)
hello nihao yes, now no
hello
nihao
yes
now
no
-- allwords传入一个匿名函数, 统计hello出现的次数
> do
>> local count = 0
>> allwords( function (w) if w == "hello" then count = count +1 end end )
>> print(count)
>> end
hello, nihao, yes, hello
Hello, hello
3
allwords在generic for中的用法, 上一篇文章的例子
2. 使用closure的例子, 将状态值存储在closure中.
factory函数, 返回iterator匿名函数以及state状态值. state封装在iterator匿名函数中.
> function allwords()
>> local state = {line = io.read(), pos = 1} -- 使用factory函数的local变量表存储状态值, 对iterator来说就是non-local变量
>> return function (state)
>> while state.line do -- 重复直到最后一行
>> local s,e = string.find(state.line, "%w+", state.pos) -- 查找单词
>> if s then
>> state.pos = e+1
>> return string.sub(state.line, s, e) -- 返回单词
>> else -- 否则下一行
>> state.line = io.read()
>> state.pos = 1
>> end
>> end
>> return nil -- 如果没有值, iterator函数返回nil给控制变量, 因此结束generic for循环.
>> end, state
>> end
> for w in allwords() do
>> print (w)
>> end
hello nihao a
hello
nihao
a
时间: 2025-01-22 10:30:33