(Ruby)sort = 1,rating = 0,(sort&& rating)== 1返回true或false?

时间:2012-06-11 02:00:20

标签: ruby

更新:我错误输入了2个变量......太尴尬了。感谢大家的努力!

抱歉,我发现我为2个不同的env键入了错误的值,第一个我设置了sort = 0rating=1但是在irb中我设置了sort=1rating=0。因为a and b a=1b仅评估false所以在第二种情况下我得sort。现在很清楚了。对不起,感谢大家的努力!

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

我的问题: 我有2个变量ratingsort&&rating == 1,但sort and rating ==1rails server --debug在2个不同的env中表现不同,如下所示:

1,在执行true时,在rails的调试器环境中,它们都返回(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

false

第二,在正常的irb中,它们都返回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>

{{1}}

我知道Ruby非常有活力......这种情况可能吗?

4 个答案:

答案 0 :(得分:3)

是的,这种情况是可能的,01被评估为数字(Fixnum类),因此它们都与false不同。任何非假的都必须是truenil除外)。

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

此外,运营商||&&orand不同。后者的优先级低于分配,因此当您键入

sort and rating

实际发生的是,该语句不会像您通常认为的那样被执行,因为只评估第二个操作数(因此只会推送其值)。

想想

ruby-1.9.2-head > 4 and 3
 => 3 
ruby-1.9.2-head > 3 and 4
 => 4 

答案 1 :(得分:0)

它与Ruby的动态无关,而且与Ruby零点不会被评估为错误的事实有关,这与JavaScript或C不同。

答案 2 :(得分:0)

首先,在布尔上下文中,零在Ruby中评估为true,而不是false。唯一错误的是false本身和nil。其他所有东西 - 包括空数组,空字符串,数字零 - 都被认为是真的。

其次,布尔运算符的行为可能与您的想法不同。由于and&&除了优先级之外是相同的,同样or||。我将它们统称为ANDOR。这些是规则:

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。

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

安德鲁在评论中提到

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

由于这可能令人困惑,特别是在口头或纯文本通信中,你不能使用像true / true这样的格式化技巧,Rubyists经常会从Stephen Colbert那里得到一个页面并引用真实但不是 - 必要 - true价值统称为“真实”,而他们的对立面则是“虚假”(或“虚假”;我看过两种拼写)。此约定也用于其他语言(特别是Douglas Crockford在他的JavaScript书中),以区分实际布尔值与在条件上下文中评估为真或假的其他值。

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

$ irb
irb(main):001:0> sort=0
=> 0
irb(main):002:0> rating=1
=> 1
irb(main):003:0> sort and rating==1
=> true

答案 3 :(得分:0)

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

阅读以下代码:

true and "foo"

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

另一个例子:

false and true

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

而且:

false and nil

返回false也是出于同样的原因。

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

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