【问题标题】:Does Ruby have a `bool` function like Python?Ruby 有像 Python 一样的“bool”函数吗?
【发布时间】:2019-05-22 20:07:13
【问题描述】:

在 Python 中,如果我使用 bool 函数,我可以确定表达式计算的布尔值。例如:

bool(1)
#=> True

Ruby 中是否存在这样的结构?我似乎找不到证据证明它确实如此。我目前不得不使用等价测试来确定布尔值,并且想知道是否有更方便的方法来做到这一点。

【问题讨论】:

  • 您希望在 Ruby 中将哪些值计算为true,哪些计算为false? Ruby 和 Python 不同意这个问题(不仅要考虑 0,还要考虑空字符串、数组、范围等),所以如果你想要一些行为类似于 Python 的东西,你需要自己编写。
  • stackoverflow.com/q/3028243/1126841 可能是相关的。
  • 我想知道bool(1) #=> true 是否暗示你会期望bool(0) #=> falsetruefalse 是什么?预期的输出或其他输入是什么?你能详细说明一下吗?
  • 查看stackoverflow.com/a/35092232/128421,了解我们如何看待 Ruby 真/假。

标签: python ruby boolean-logic


【解决方案1】:

永远都是经典

!!a

这也适用于 Javascript、C++ 和(使用 not 而不是 !)Python。

请记住,Ruby 的真实性概念与 Python 不同。在 Python 中,很多“空”对象都是虚假的,自定义类可以通过一种神奇的方法来确定它们的真实性。在 Ruby 中,只有 nilfalse 是虚假的,而所有 其他值(包括数字、字符串、列表和任何用户定义的类)都是真实的。

【讨论】:

    【解决方案2】:

    如果你想要的是1 == true0 == false,你应该明确比较值,例如:

    if x == 1
      # do something
    end
    

    这是因为,在 Ruby 中,只有 falsenil 是虚假的。其余的计算结果为true

    换句话说:

    def to_bool(x)
      !!x
    end
    
    to_bool(1)          #=> true
    to_bool(0)          #=> true
    to_bool("0")        #=> true
    to_bool("1")        #=> true
    to_bool(Object.new) #=> true
    
    to_bool(nil)        #=> false
    

    【讨论】:

    • 整洁的自定义函数,我一定会用的
    【解决方案3】:

    如果您知道要使用哪种类型,您可以尝试在 Ruby 中模仿 Python 的逻辑。

    空列表、散列或字符串在 Ruby 中是真实的,因此您需要检查它们是否不为空:

    ![].empty?
    # => false
    ![3].empty?
    # => true
    !"".empty?
    # => false
    !"foo".empty?
    # => true
    

    同样,您可以检查一个整数是否不为零:

    0 != 0
    #=> false
    1 != 0
    #=> true
    3.14 != 0
    #=> true
    

    【讨论】:

    • 谢谢,方便了解
    • 还有zero? / nonzero?
    • @Stefan:谢谢。不过,这可能会让 OP 感到困惑,因为 nonzero? 不是 zero? 的否定。
    猜你喜欢
    • 2014-06-05
    • 2016-06-10
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2011-10-26
    相关资源
    最近更新 更多