lua - Lua中pairs()的“类型签名”是什么?
问题描述
查看“Lua 编程”中的第7.1 章 – 迭代器和闭包,似乎for foo in bar
循环需要bar
为类型(使用 Java 类型来表达它)Supplier<Tuple>
,并且for-in
将继续调用bar
直到它返回nil
。
所以对于类似的东西:
for k,v in pairs( tables ) do
print( 'key: '..k..', value: '..v )
end
这意味着pairs
有一种Function<Table,Supplier<Tuple>>
.
我想创建一个行为类似的函数,pairs
除了它跳过第一个参数以下划线开头的元组(即_
)。
local function mypairs( list )
local --[[ Supplier<Tuple> ]] pairIterator = pairs( list )
return --[[ Supplier<Tuple> ]] function ()
while true do
local key, value = pairIterator()
if key == nil then
return nil
elseif key:sub(1,1) ~= '_' then
return key, value
end
end
end
end
但是它不起作用,因为
--[[should be: Supplier<Table>]] pairIterator = pairs({ c=3; b=2; a=1 })
当我调用它时
pairIterator()
它返回
stdin:1: bad argument #1 to 'pairIterator' (table expected, got no value)
stack traceback:
[C]: in function 'pairIterator'
stdin:1: in main chunk
[C]: in ?
但
pairIterator({ c=3; b=2; a=1 })
返回
Lua>pairIterator({ c=3; b=2; a=1 })
c 3
解决方案
您的基本问题是您在 Lua 问题上使用 Java 逻辑。Java 和 Lua 是具有不同结构的不同语言,认识到这一点很重要。
pairs
没有返回值;它有多个返回值。这是Java完全缺乏的一个概念。ATuple
是可以存储和操作多个值的单个值。Lua 函数可以返回多个值。这在语法和语义上与返回包含多个值的表不同。
基于迭代器的for
语句将多个值作为其输入,而不是包含多个值的表或容器。具体来说,它存储 3 个值:一个迭代器函数、一个状态值(用于在调用之间保留状态)和一个初始值。
所以,如果你想模仿pairs
的行为,你需要能够存储和操作它的多个返回值。
您的第一步是存储pairs
实际返回的内容:
local f, s, var = pairs(list)
您正在创建一个新的迭代器函数。所以你需要返回那个,但你也需要返回那个返回的s
和。您的退货声明需要如下所示:var
pairs
return function (s, var)
--[[Contents discussed below]]
end, s, var --Returning what `pairs` would return.
现在,在您的函数内部,您需要f
使用s
and调用var
。此函数将返回键/值对。您需要正确处理它们:
return function (s, var)
repeat
local key, value = f(s, var)
if(type(key) ~= "string") then
--Non-string types can't have an `_` in them.
--And no need to special-case `nil`.
return key, value
elseif(key:sub(1, 1) ~= '_') then
return key, value
end
until true
end, s, var --Returning what `pairs` would return.
推荐阅读
- php - 使用 Symfony 访问传递给表单生成器的实体
- javascript - 文本偏移画布并影响鼠标悬停位置
- ios - 找不到目标“x86_64-apple-ios-simulator”的模块
- dart - 目录比较在 Dart 中不起作用?
- linq - 创建包含 linq 查询的异步方法
- apache-spark - 在 Apache Spark 中,同一 Stage 中的任务是否同时工作?
- r - 在 Windows 和 Linux 上为特定 PRNG 生成不同的随机数
- python - 将字典中的函数用于菜单
- visual-studio - 如何将 firebase ml 套件与 xamarin.forms 一起使用?
- python - 获取程序中的计算次数