【问题标题】:Boolean to number in LuaLua 中的布尔数字
【发布时间】:2018-01-12 16:40:00
【问题描述】:

有没有办法在 Lua 中得到 1 为真,0 为假? tobool 用 1 或 0 给出真或假,但 tonumber 用真或假给出 nil 值。

【问题讨论】:

    标签: lua boolean


    【解决方案1】:

    您可以像三元运算符一样组合andor 子句。

    function bool_to_number(value)
      return value and 1 or 0
    end
    

    【讨论】:

    • 不使用函数可以做到吗?就像在 print() 中一样
    • @HellProtection print(value and 1 or 0)
    • 应该注意的是,这个解决方案(尽管在大多数情况下实际上很有用)将任何值视为 true,并将 nil 视为 false,这可能不是 OP 想要的,在这种情况下lhf 的解法更准确。
    【解决方案2】:

    您也可以这样做:

    bool_to_number={ [true]=1, [false]=0 }
    
    print(bool_to_number[value])
    

    或者这个:

    debug.setmetatable(true, {__len = function (value) return value and 1 or 0 end})
    
    print(#true)
    print(#false)
    

    【讨论】:

    • 为什么 true > false 在 Lua 中不等于 true?在许多编程语言中,布尔值是由 2 个值组成的有序集合。
    • 为什么要这样?它宁愿将此属性视为这些语言的怪癖。当然,你可以滥用它,但我想它不打算用任何语言来做到这一点。如果你需要这个,我的第一印象是你正在做一些可能有更好方法的事情。
    • @pschulz - 所以,你不明白的一切都是怪癖?应订购布尔值以保持一致性。处理数字的方法也应该处理布尔值。
    • 放心,我只是陈述我的观点。请向我解释为什么你认为这是有道理的。无论如何,true > false 是什么意思?我想不出使用它是做某事的正确方法的场景。当然,您可以使用它,它在某些语言中运行良好。但我不认为这是lua缺少的功能。此外,在 lua 中您很少需要布尔值,因为您几乎总是可以根据 nil 检查您的对象。
    • @EgorSkriptunoff 有趣,我没见过这种方式。我可以看到你来自哪里,但我仍然不同意。 3 大于 1,任何人都可以看到这一点,它“有道理”。 'foo' > 'bar',如果你考虑像字典排序这样的东西。但我无法理解真实大于虚假。它不是。它也不是更小,它是错误的问题。此外:我从未对布尔值进行排序,我无法想象我为什么要这样做。如果需要,我会为此编写一个比较函数。
    【解决方案3】:

    hjpotter92 的答案将任何不同于 nil 的值作为真值(返回 1)。而是取值 true 或 false。

    local value = true
    print(value == true and 1 or value == false and 0)
    -- we add the false check because it would drop 0 in case it was nil
    

    如果你想使用一个函数,那就是它

    local value = true
    local function bool_to_number(value)
     return value == true and 1 or value == false and 0
    end
    
    print(bool_to_number(value))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2013-06-06
      相关资源
      最近更新 更多