微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

变量 – 不等于这个或那个在Lua

我试图验证一个变量不等于这个或那个.我尝试使用以下代码,但不起作用:
if x ~=(0 or 1) then
    print( "X must be equal to 1 or 0" )
    return
end


if x ~= 0 or 1 then
    print( "X must be equal to 1 or 0" )
    return
end

有没有办法做到这一点?

解决方法

你的问题源自对学习这种编程语言的人常见的操作者的误解.是的,您的直接问题可以通过编写 x ~= 0 and x ~= 1解决,但是我将详细介绍一下为什么尝试解决方案不起作用.

当您读取x〜=(0或1)或x〜= 0或1时,很自然地解析这个句子“x不等于零或一”.在这种说法的普遍理解中,“x”是主体,“不等于”是谓词或动词短语,“零或一”是对象,一组可能性由一个连词组合.您可以使用动词将该主题应用于该集合中的每个项目.

然而,Lua不会根据英语语法的规则来解析这个问题,它会根据其操作顺序对二元素的二进制比较进行解析.每个运算符都有一个precedence,它决定了它的评估顺序.或者具有比〜=低的优先级,就像数学中的加法比乘法具有更低的优先级.一切都比括号低一点.

因此,当评估x〜=(0或1)时,解释器将首先计算0或1(因为括号),然后x〜=第一次计算的结果,而在第二个例子中,它将计算x〜= 0,然后将该计算的结果应用于或1.

如果该值与nil和false不同,则logical operator or“返回其第一个参数;否则返回其第二个参数”. relational operator ~=是等式运算符==的倒数;它的参数是不同的类型(x是一个数字,对吗?)返回true,否则通常比较它的参数.

使用这些规则,x〜=(0或1)将分解为x〜= 0(在应用或运算符之后),如果x是0以外的任何值,则返回“true”,包括1,这是不合需要的.另一种形式,x〜= 0或1将首先评估x〜= 0(这可能会返回true或false,这取决于x的值).然后,它将分解为false或1或true或1.在第一种情况下,语句将返回1,在第二种情况下,语句将返回true.因为Lua中的控制结构只考虑nil和false为false,而其他任何事情都是真的,这将始终输入if语句,这不是你想要的.

没有办法可以使用编程语言中提供的二进制运算符将单个变量与值列表进行比较.相反,您需要逐个比较变量与每个值.有几种方法可以做到这一点.最简单的方法是使用De Morgan’s laws表示“不是一个或零”(不能用二进制运算符来评估)的语句是“不是而不是零”,这可以用二进制运算符进行编写:

if x ~= 1 and x ~= 0 then
    print( "X must be equal to 1 or 0" )
    return
end

或者,您可以使用循环来检查这些值:

local x_is_ok = false
for i = 0,1 do 
    if x == i then
        x_is_ok = true
    end
end
if not x_is_ok then
    print( "X must be equal to 1 or 0" )
    return
end

最后,您可以使用关系运算符检查范围,然后测试x是范围内的整数(您不需要0.5,对吗?)

if not (x >= 0 and x <= 1 and math.floor(x) == x) then
    print( "X must be equal to 1 or 0" )
    return
end

请注意,我写了x> = 0和x <= 1.如果您理解上述说明,您现在应该可以解释为什么我不写0 <= x <= 1,这个错误表达会回来!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.github代码实践源代码是lua脚本语言,下载th之后运行thmain.lua-netTypevgg-savevgg_cifar10/-S0.0001,报错: 试看看安装lua:报错了,参考这篇文章:ubuntu18.04安装lua的步骤以及出现的问题_weixin_41355132的博客-CSDN博客问题解决,安装成功:情况并没有好转,出现相
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/p/5999924.html前言在看了uwa之前发布的《Unity项目常见Lua解决方案性能比较》,决定动手写一篇关于lua+unity方案的性能优化文。整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法。然而作
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能。1.TIMERime是一款可以高度自定义的输入法,相关教程可以查看往期文章,关于时间获取是指输入一个指定关键字,输出当前时间,效果如下(我定义了time关键字):实现如下:①在用户文件夹中新建一个rime.lua文件加入如下代码 ti
localfunctiongenerate_action(params)localscale_action=cc.ScaleTo:create(params.time,params.scale_x,params.scale_y)localfade_action=cc.FadeIn:create(params.time)returncc.Spawn:create(scale_action,fade_action)end
2022年1月11日13:57:45 官方:https://opm.openresty.org/官方文档:https://opm.openresty.org/docs#table-of-contents为什么建议使用opm不建议使用luarocks?http://openresty.org/cn/using-luarocks.html官方解释:请注意!LuaRocks并不是OpenResty官方推荐的装包方式。LuaRoc
在Lua中的table(表),就像c#中的HashMap(哈希表),key和value一一对应。元表:table的一个操作的拓展,里面包含关联了对应的方法,元方法就是其中一个。元方法:当你通过键来访问table的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index键。如果__inde
表排序:table.sort(list[,comp])参数list:指定表,可选参数comp:排序函数,无参数时通常按升序排序。排序函数针对表中连续的序列,其间不可以存在空洞或nil,排序函数需要两个形参(对应表中每次参加比较的两个数据),需要一个比较两个形参表达式的返回值,不能含有等于关系,例如>=,<=,==。do
一、安装lua环境1.1安装依赖包[root@centos7~]#yuminstallgccreadline-devel1.2下线lua源码包并解压[root@centos7~]#wgethttp://www.lua.org/ftp/lua-5.3.5.tar.gz[root@centos7~]#tarxvflua-5.3.5.tar.gz-C/usr/local/src1.3进行编译[root@centos7~]
官网OpenResty® 是一个基于 Nginx 与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由
表参考《lua程序设计》可以认为,表是一种动态分配的对象,程序只能操作指向表的引用(或指针)。除此以外,Lua语言不会进行隐藏的拷贝(hiddencopies)或创建新的表--创建表a={}--创建空表k="x"a[k]=10--键“x”值10a[20]="great"--键20值“great”print(a["x"])-->10