更新:我错误输入了2个变量......太尴尬了。感谢大家的努力!
抱歉,我发现我为2个不同的env键入了错误的值,第一个我设置了sort = 0
和rating=1
但是在irb中我设置了sort=1
和rating=0
。因为a and b
a=1
时b
仅评估false
所以在第二种情况下我得sort
。现在很清楚了。对不起,感谢大家的努力!
======================
我的问题:
我有2个变量rating
和sort&&rating == 1
,但sort and rating ==1
和rails 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非常有活力......这种情况可能吗?
答案 0 :(得分:3)
是的,这种情况是可能的,0
和1
被评估为数字(Fixnum
类),因此它们都与false
不同。任何非假的都必须是true
(nil
除外)。
您可以使用.zero?
方法隐式转换为boolean
。
此外,运营商||
和&&
与or
和and
不同。后者的优先级低于分配,因此当您键入
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
和||
。我将它们统称为AND
和OR
。这些是规则:
a AND b
如果a为假则返回a,如果a为真,则返回b。
a OR b
如果a为真则返回a,如果a为假则返回b。
所以它们实际上只是if a then b else a
和if 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==1
从false
返回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中,false
和nil
的任何期望都是true
。