为什么|| 和/或在rails中表现不同?

可能重复:
在Ruby中,i = true和false是真的吗?
Perl(或,和)和(||,&&)短路运营商之间有什么区别?
Ruby:||之间的区别 和’或’

|| or Rails相同?

案例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) 

||的原因 和/或表现不同是因为运算符优先级。

两个|| 和&&的优先级高于赋值运算符,赋值运算符(=)的优先级高于和/或

所以你的表达式实际上将按如下方式进行评估: –

@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

如果对优先规则有疑问,请使用括号使您的意思清楚。

引自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 ,而表达式的第二部分没有分配给任何东西。 如果要使用或,则应使用显式括号:

 @year = (params[:year] or Time.now.year) 

这就是区别。