AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77672280
Accepted
Jan
Jan
Asked: 2023-12-17 03:47:30 +0800 CST2023-12-17 03:47:30 +0800 CST 2023-12-17 03:47:30 +0800 CST

Lua if 语句总是转到 else 选项

  • 772

我对 Lua 完全陌生,无法理解这一点:以下函数总是返回 99,即使 angleNumber 是 2,3,4 等。

我是否忽略了一些 Lua 语法怪癖?

local function mirroredNumber (angleNumber)
    
    if angleNumber == 2 then
        return 8
    elseif angleNumber == 3 then
        return 7
    elseif angleNumber == 4 then
        return 6
    elseif angleNumber == 6 then
        return 4
    elseif angleNumber == 7 then
        return 3
    elseif angleNumber == 8 then
        return 2
    else
        return 99
    end
end

我尝试在 if 语句中设置一个局部变量并最终返回该变量,但这也不起作用,所以我认为我的 if/elseif 检查是错误的,但我无法弄清楚如何。

lua
  • 1 1 个回答
  • 31 Views

1 个回答

  • Voted
  1. Best Answer
    Luatic
    2023-12-17T04:19:27+08:002023-12-17T04:19:27+08:00

    有两个相关的 Lua 怪癖,我怀疑其中之一在这里起作用:

    • 字符串 - 数字强制,但严格相等检查;
    • 使用浮点数,但打印不准确,隐藏舍入错误

    让我们首先简化您的示例:

    function f(x)
        if x == 1 then
            return 0
        end
        return 1
    end
    

    如此,并且对于每个不等于的情况也是f(1)如此。0f(x)1x1

    像数字一样嘎嘎作响的字符串

    Lua 有一个有争议的“功能”,如果你对字符串进行算术运算,它会将字符串强制转换为数字,如果你对它们进行算术运算,则会将数字强制转换为字符串;print只是内部调用tostring,不引用字符串,因此字符串非常“像数字一样嘎嘎”。然而,相等性(或表索引)测试是“严格的”;它还需要类型匹配。看这个例子:

    -- Oops! This should be a number.
    -- In practice this might be something less obvious like a function returning a string.
    local x = "1"
    print(x + 2) -- 3, we can do arithmetic as if it was a number!
    print(x) -- 1, it looks just like it was a number!
    print(type(x)) -- string
    print("1" == 1) -- false, the types don't match
    print(f(x)) -- 1, because "1" ~= 1
    

    这里的解决方案,假设x是一个来自文件或类似文件的字符串,是tonumber(x)(或等效的:x + 0,其行为大致类似于assert(tonumber(x)))。

    舍入误差

    Lua 使用浮点数来表示数字。浮点数可以准确地表示高达 2^53 的整数(不会损失精度),因此在处理整数时,这通常不是问题。但是,您可以构造非常接近整数的浮点数,但实际上不是整数。不幸的是,Lua在打印数字时会对数字进行四舍五入,因此如果插入调试打印,您将看不到这一点。考虑:

    local x = 0.2 + 6 * 0.3
    print(x) -- 2.0
    print(x == 2) -- false, what? how does 2 not equal 2?
    

    要发现这一点,请打印x到 17 位精度:

    print(("%.17g"):format(0.2 + 6 * 0.3)) -- 1.9999999999999998
    

    如果您知道自己的工作存在不准确之处,则应该与一些“错误空间”进行比较。x == 1因此,您无需测试 ,而是测试math.abs(x - 1) < 1e-6,1e-6在此示例中,您的(绝对)误差范围在哪里。(注意:相对误差范围有时可能更合适;浮动尤其可以保证一定的相对误差)。


    旁注:在许多具有switches、模式匹配或类似功能的语言中,函数和switch+return可能是实现此功能的惯用方式。然而,考虑到这只是从一些数字到其他数字的映射,你通常会在 Lua 中使用一个表:

    local mirrored_numbers = {
        [2] = 8,
        [3] = 7,
        -- ... and so on
    }
    local function mirror_number(x)
        return mirrored_numbers[x] or 99
    end
    

    x(另外,“镜像”数字和( )之间似乎存在简单的对应关系if angleNumber >= 2 and angleNumber <= 8 then return 10 - angleNumber end,除非您只是在本示例中简化了它;为什么不利用它呢?)

    • 2

相关问题

  • Lua脚本在按下几个键后执行命令

  • 如果表中有多个元素,如何在 Lua 中检查?

  • Lua脚本结束TCP连接?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve