通过assert(loadfile(play.lua))(argument)传递参数不会将任何内容分配给play.lua内的arg[1]

问题描述 投票:0回答:1

我有一个脚本

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 arguments parameter-passing
1个回答
0
投票

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]
结合使用,将使其起作用。

© www.soinside.com 2019 - 2024. All rights reserved.