我有一个脚本
play.lua
,它使用文件名作为参数来播放文件每一行上写的音符。我正在尝试编写一个脚本 jukebox.lua
,它将根据输入使用各种参数运行 play.lua
,但全局参数表不会保存我使用 loadfile
分配的参数
play.lua(错误部分)
local name = "file " .. arg[1]
for line in io.lines(arg[1]) do
--[[note playing code]]--
print(".")
end
我的第一次尝试看起来像这样,但在尝试将
arg[1]
分配给 arg[1]
中的变量时会返回一个错误,指出
play.lua
是 nil 值
点唱机.lua
assert(loadfile("play.lua"))("file1")
然后我尝试在
arg[1]
中分配
jukebox.lua
arg[1] = "file1"
assert(loadfile("play.lua")
这运行了代码,没有错误,但是使用
lua jukebox.lua
不会播放任何内容,也不打印任何内容,而 lua play.lua file1
会正常播放文件,并且会为文件 file1 中的每一行显示 print(".")
。
我也尝试了dofile
和require
,结果相似
我的问题:在脚本中编写
assert(loadfile("play.lua"))("file1")
与在控制台中编写 lua play.lua file1
不一样吗?
Lua 独立解释器将命令行参数放入全局
arg
并将它们传递给它调用的块。换句话说,当你做lua play.lua file1
时,会发生这样的事情:
arg = {"file1"}
assert(loadfile("play.lua"))("file1")
然后脚本可以使用可变参数语法
...
或全局 arg
来访问它们。您的 play.lua
使用后者。 assert(loadfile("play.lua"))("file1")
给出错误,因为它只是设置前者。 assert(loadfile("play.lua"))
没有做任何事情,因为它只是加载块,而不是实际调用它。添加一组额外的空括号,即 assert(loadfile("play.lua")()
,将解决此问题,并与您设置 arg[1]
结合使用,将使其起作用。