gpt4 book ai didi

ruby - 需要澄清 Ruby 逻辑运算符

转载 作者:数据小太阳 更新时间:2023-10-29 08:22:36 24 4
gpt4 key购买 nike

最近我开始学习 Ruby。我在 irb 中练习逻辑运算符,我得到了这些我不明白的结果。你能为我解释一下这些例子吗?

1 and 0
#=> 0

0 and 1
#=> 1

0 && 1
#=> 1

最佳答案

与 C 等其他语言相反,在 Ruby 中,除了 nilfalse 之外的所有值都被认为是“真实的”。这意味着,所有这些值在 bool 表达式的上下文中都表现得像 true

Ruby 的 bool 运算符不会返回truefalse。相反,它们返回导致条件评估完成的第一个操作数(也称为 short-circuit evaluation )。对于 bool and 这意味着,它将返回第一个“假”操作数或最后一个:

false && 1    # => false     (falsy)
nil && 1 # => nil (falsy)
false && nil # => false (falsy)
1 && 2 # => 2 (truthy)

对于 bool or 这意味着,它将返回第一个“真实”操作数或最后一个:

false || 1    # => 1         (truthy)
nil || 1 # => 1 (truthy)
false || nil # => nil (falsy)
1 || 2 # => 1 (truthy)

这允许一些有趣的构造。使用 || 设置默认值是一种非常常见的模式,例如:

def hello(name)
name = name || 'generic humanoid'
puts "Hello, #{name}!"
end

hello(nil) # Hello, generic humanoid!
hello('Bob') # Hello, Bob!

另一种实现相同目的的类似方法是

name || (name = 'generic humanoid')

还有一个额外的好处,如果 name 是真实的,则根本不会执行任何分配。这种默认值分配甚至有一个快捷方式:

name ||= 'generic humanoid'

如果您仔细注意,您会注意到这可能会导致一些麻烦,如果一个有效值为 false:

destroy_humans = nil
destroy_humans ||= true
destroy_humans
#=> true

destroy_humans = false
destroy_humans ||= true
destroy_humans
#=> true, OMG run!

这很少是想要的效果。因此,如果您知道值只能是 Stringnil,请使用 ||||=很好。如果变量可以为 false,则必须更详细:

destroy_humans = nil
destroy_humans = true if destroy_humans.nil?
destroy_humans
#=> true

destroy_humans = false
destroy_humans = true if destroy_humans.nil?
destroy_humans
#=> false, extinction of humanity digressed!

太接近了!但是等等,还有另一个警告——特别是 andor 的使用。这些应该永远不会用于 bool 表达式,因为它们有 very low operator precedence .这意味着它们将被最后评估。考虑以下示例:

is_human = true
is_zombie = false
destroy_human = is_human && is_zombie
destroy_human
#=> false

is_human = true
is_zombie = false
destroy_human = is_human and is_zombie
destroy_human
#=> true, Waaaah but I'm not a zombie!

让我添加一些括号来阐明这里发生的事情:

destroy_human = is_human && is_zombie
# equivalent to
destroy_human = (is_human && is_zombie)

destroy_human = is_human and is_zombie
# equivalent to
(destroy_human = is_human) and is_zombie

所以 and 和 or 实际上只是用作“控制流运算符”,例如:

join_roboparty or fail 'forever alone :('
# this will raise a RuntimeError when join_roboparty returns a falsy value

join_roboparty and puts 'robotz party hard :)'
# this will only output the message if join_roboparty returns a truthy value

我希望这能阐明您需要了解的有关这些运算符的所有信息。这需要一点时间来适应,因为它不同于其他语言处理它的方式。但是,一旦您知道如何使用不同的选项,您就拥有了一些强大的工具。

关于ruby - 需要澄清 Ruby 逻辑运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27375152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com