Lua中io.read("*all")的含义与规范行为咨询
Lua中
*all/*line这类文件读取格式的行为说明 我们都知道Lua的文件读取函数file.read()中,官方参考手册明确规定了单字符格式:
*a:读取整个文件内容*l:读取文件的一行内容(默认行为)
但你在《Programming in Lua》里看到的*all,以及网页上出现的*line,本质上是非标准的兼容写法:
Lua的底层实现中,对于带*的格式字符串,只会解析*之后的第一个字符,后续的所有字符都会被当作无效的“噪声字符串”直接忽略。也就是说:
*all等价于*a*line等价于*l
你之前误以为*nn会读取两个数字、*ll会读取两行,这种理解是错误的——这类多字符星号格式不会重复执行读取操作,因为底层只会识别*后的第一个有效字符,剩下的内容不会被处理。
正如那条Reddit评论所说:
But "umber" is a noise string. You're relying on the implementation of file.read to ignore all characters in the format specifier after the second for star formats. What if that changes?
划重点:这类长格式没有被Lua官方手册明确定义,属于实现层面的隐含行为。虽然目前Lua 5.3及其他已查版本都遵循这个逻辑,但未来版本完全有可能修改这个处理逻辑,因此不建议依赖这种写法。
正确且安全的做法,始终是使用官方规定的单字符格式*a和*l。
内容的提问来源于stack exchange,提问作者Masquue
相关产品推荐
相关产品推荐

