Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用eval命令在Lua脚本中指定局部变量_Lua_Eval - Fatal编程技术网

使用eval命令在Lua脚本中指定局部变量

使用eval命令在Lua脚本中指定局部变量,lua,eval,Lua,Eval,我是lua脚本的初学者。我尝试在redis客户端中执行以下命令 eval "print('hello world')" 0 而且还我很好 hello (nil) 首先,我不明白为什么nil总是被退回/打印??是因为lua数据类型到redis数据类型的相互转换返回零吗 然后我使用if构造并执行下面的脚本 eval "local t = 0; if t == 0 then print('hello'); end" 0 0 上述命令按预期打印 hello (nil) 但是当我尝试使用下

我是lua脚本的初学者。我尝试在redis客户端中执行以下命令

eval "print('hello world')" 0
而且还我很好

hello
(nil)    
首先,我不明白为什么nil总是被退回/打印??是因为lua数据类型到redis数据类型的相互转换返回零吗

然后我使用if构造并执行下面的脚本

eval "local t = 0; if t == 0 then print('hello'); end" 0 0
上述命令按预期打印

hello
(nil)
但是当我尝试使用下面的代码将参数赋值给局部变量时

eval "local t = ARGV[1]; if t == 0 then print('hello'); end" 0 0
输出仅为

(nil)
那么,有人能解释一下如何将外部参数赋值给局部变量吗?

根据,使用
eval()
执行的
chunk
全局变量访问被禁用。虽然没有提到,但我怀疑访问
本地的
文件是更大的违规行为和可能的泄漏。因此,您应该遵循官方文档,改用
Redis-keys
。当然,也可以重复使用退回的旅行箱

eval()
文档中的相关区块:

全局变量保护

不允许Redis脚本创建全局变量,以避免数据泄漏到Lua状态。如果脚本需要在调用之间保持状态(这是一种非常罕见的需要),那么它应该使用Redis键

刚意识到,该问题的主体与问题的标题不匹配,因此重新开始

正确的
eval()
用法(来自Redis文档):

EVAL的第一个参数是lua5.1脚本。脚本不需要定义Lua函数(也不应该定义)。它只是一个Lua程序,将在Redis服务器的上下文中运行

EVAL的第二个参数是脚本后面(从第三个参数开始)表示Redis键名的参数数。Lua可以使用KEYS全局变量以基于一个数组的形式访问这些参数(因此KEYS[1]、KEYS[2]、…)

所有附加参数都不应表示键名,并且可以由Lua使用ARGV全局变量访问,这与键的情况非常类似(因此ARGV[1]、ARGV[2]、…)

在您的示例中,您将参数的数量设置为
0
,因此,不会向Lua脚本传递任何内容。快速修复:

eval“本地t=ARGV[1];如果t==0,则打印('hello');结束“10


不确定
nil
,但这可能是因为您提供的Lua块没有返回任何内容。

redis eval命令只不过是将您的输入拆分为标记,因此您的参数
0
字符串
,而不是
数字

但是,在Lua中,比较
0==“0”
是错误的,因此您需要做的是更改为以下任一变体:

eval "local t = ARGV[1]; if t == '0' then print('hello'); end" 0 0
eval "local t = ARGV[1]; if tonumber(t) == 0 then print('hello'); end" 0 0
注意:因为Kamiccolo提到了is;请注意,在Lua的eval中,您永远无法从eval外部访问
本地
变量,因为代码总是在全局上下文中进行计算

@Kamiccola:“EVAL的第二个参数是脚本后面(从第三个参数开始)表示Redis键名的参数数。”它应该是0,因为我没有向它传递任何键名,我尝试了你所说的,但它不起作用!您能否尝试
eval“print('arg[1]是',ARGV[1])”0 123
查看它是否打印123?你看过吗?