1

更新:我打错了 2 个变量……太尴尬了。感谢大家的努力!

抱歉,我发现我为 2 个不同的 env 输入了错误的值,第一个是我设置的sort = 0rating=1然后在 irb 中我设置了sort=1rating=0。因为a and ba=1它只b在第二种情况下评估时,我得到了false。现在很清楚了。粗心见谅,感谢大家的努力!

=======================

我的问题:我有 2 个变量sortrating,但两者在 2 个不同的环境sort&&rating == 1sort and rating ==1表现不同,如下所示:

1st,在我执行时在rails的调试器环境中rails server --debug,它们都返回true

(rdb:130) rating 
1
(rdb:130) sort
0
(rdb:130) sort and rating == 1
true
(rdb:130) sort && rating == 1
true
(rdb:130) (sort && rating) == 1
true

第二,在正常的irb中,它们都返回false

irb(main):001:0> sort = 1
=> 1
irb(main):002:0> rating = 0
=> 0
irb(main):003:0> sort||rating
=> 1
irb(main):004:0> sort and rating
=> 0
irb(main):005:0> sort and rating == 1
=> false
irb(main):006:0> sort && rating == 1
=> false
irb(main):007:0> 0 == true
=> false
irb(main):008:0> 

我知道 Ruby 是如此动态,以至于……这种情况可能吗?

4

4 回答 4

3

是的,这种情况是可能的,0并且1被评估为数字(Fixnum类),因此它们都不同于false. 并且任何不为假的东西都必须是true(除了nil)。

您可以使用该.zero?方法隐式转换为boolean.

此外,运算符||and 与and&&不同。后者的优先级低于分配,因此当您键入时orand

sort and rating

实际发生的情况是,该语句并未像您想象的那样执行,因为仅评估了第二个操作数(因此仅将其值作为结果推送)。

想一想

ruby-1.9.2-head > 4 and 3
 => 3 
ruby-1.9.2-head > 3 and 4
 => 4 
于 2012-06-11T02:07:04.510 回答
0

它与 Ruby 的活力无关,而与在 Ruby 中零不会评估为假的事实有关,这与 JavaScript 或 C 不同。

于 2012-06-11T02:37:32.153 回答
0

首先,在布尔上下文中,零在 Ruby 中计算为真,而不是假。唯一不正确的是false它自己和nil。其他一切——包括空数组、空字符串、数字零——都被认为是真的。

其次,布尔运算符的行为可能与您想象的不太一样。因为and&&是相同的,除了优先级,同样or||。我将它们统称为ANDand OR。这些是规则:

a AND b如果 a 为假,则返回 a,如果 a 为真,则返回 b。

a OR b如果 a 为真,则返回 a,如果 a 为假,则返回 b。

所以它们实际上只是 和 的简写if a then b else aif a then a else b分别。真值表是熟悉的,但实际结果总是与输入之一相同,而不是一些新构造的纯布尔值。

尽管优先级不同,这两个版本:

sort AND rating == 1

等同于:

sort AND (rating == 1)

因此,由于 sort 为零,这是真的,上面的表达式返回 的值(rating == 1),这也是真的(事实上,true)。如果你和 一起去rating AND sort == 1,它会是false,因为sort不是 1。

如果您遵循上面给出的规则,您可以看到其他结果的来源。

注意:正如 Andrew 在评论中所提到的,所有这些不同的“真实”值仍然与其true自身不同;0 可能被认为是真的,但0 == true仍然是假的。(这适用于任何允许在条件上下文中使用非布尔值的语言;例如,在 C 中,任何非零数都为真,但这并不意味着任何两个非零数相等。)

由于这可能会令人困惑,尤其是在口头或纯文本交流中,您不能使用诸如 true/ 之类的格式化技巧true,Rubyists 经常借鉴 Stephen Colbert 的做法,将 true-but-not-necessarily-true值统称为“truthy” ",以及它们的反义词为“falsy”(或“falsey”;两种拼写我都见过)。此约定也用于其他语言(特别是 Douglas Crockford 在他的 JavaScript 书中),以区分实际的布尔值与在条件上下文中评估为真或假的其他值。

ETA:至于你从 回来的结果,sort and rating==1我无法重现。在 1.8.7 和 1.9.3 中,我得到了基于上述的预期输出:falseirb

$ irb
irb(main):001:0> sort=0
=> 0
irb(main):002:0> rating=1
=> 1
irb(main):003:0> sort and rating==1
=> true
于 2012-06-11T02:37:36.187 回答
0

简单来说,在 Ruby 中,逻辑表达式返回决定表达式结果的第一个值,否则返回最后一个计算值。

阅读以下代码:

true and "foo"

如您所知,and操作员必须确保两个值都被评估为true. 但是,仅在计算 时尚未确定true,因此决定性因素"foo"为真,将被接受为表达式的最终值。

另一个例子:

false and true

看,false这里是决定性的,所以会被退回。

和这个:

false and nil

false也以同样的理由返回。

该规则也可用于or运算符,如果一个值true在 的左侧or被评估,则不再评估右侧。

我认为您需要强调的另一个概念是,在 Ruby 中,任何期望falsenilis true

于 2012-06-11T03:31:45.560 回答