为啥||或者在rails中表现不同? [复制]
Posted
技术标签:
【中文标题】为啥||或者在rails中表现不同? [复制]【英文标题】:Why || and or behaves differently in rails? [duplicate]为什么||或者在rails中表现不同? [复制] 【发布时间】:2011-04-23 17:22:17 【问题描述】:可能的重复:i = true and false in Ruby is true?What is the difference between Perl's ( or, and ) and ( ||, && ) short-circuit operators?Ruby: difference between || and 'or'
||
是否与 Rails 中的 or
相同?
案例A:
@year = params[:year] || Time.now.year
Events.all(:conditions => ['year = ?', @year])
将在script/console
中生成以下SQL:
SELECT * FROM `events` WHERE (year = 2000)
案例 B:
@year = params[:year] or Time.now.year
Events.all(:conditions => ['year = ?', @year])
将在script/console
中产生以下SQL:
SELECT * FROM `events` WHERE (year = NULL)
【问题讨论】:
与问题i = true and false in Ruby is true? 相同,除了or
而不是and
。
复制到:***.com/questions/3826112/…、***.com/questions/1512547/… 可能还有更多。
这个问题已经在***.Com/q/2083112、***.Com/q/1625946、***.Com/q/1426826、***.Com/q/1840488、***.Com/q/1840488、***.Com/q/1434842、***.Com/q/2376369、***.Com/q/2802494、***.Com/q/372652中提出和回答。
-1 我不介意 n00bs 多问重复,但声望超过 2K 的人应该更清楚。
@Andrew 你能建议关键字来搜索这个问题的重复项吗?我不知道如何使搜索适用于 ||
和 or
。
【参考方案1】:
原因|| and or 行为不同是因为运算符优先级。
两者||和 && 的优先级高于赋值运算符,赋值运算符 (=) 的优先级高于和/或
因此,您的表达式实际上将按如下方式进行评估:-
@year = params[:year] || Time.now.year
被评估为
@year = ( params[:year] || Time.now.year )
和
@year = params[:year] or Time.now.year
被评估为
( @year = params[:year] ) or Time.now.year
如果对优先规则有疑问,请使用括号来明确您的意思。
【讨论】:
【参考方案2】:引用http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators:
二元“或”运算符将返回其两个操作数的逻辑析取。与“||”相同但优先级较低。
a = nil
b = "foo"
c = a || b # c is set to "foo" its the same as saying c = (a || b)
c = a or b # c is set to nil its the same as saying (c = a) || b which is not what you want.
所以你or
的工作方式是:
(@year = params[:year]) or Time.now.year
所以params[:year]
分配给@year
,表达式的第二部分没有分配给任何东西。如果你想使用 or,你应该使用显式括号:
@year = (params[:year] or Time.now.year)
这就是区别。
【讨论】:
以上是关于为啥||或者在rails中表现不同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在具有一级索引的 MultiIndex 列的 pandas DataFrame 中表现不同?
为啥 clojure 的地图在 println 中表现得那样?