【问题标题】: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)

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案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)
    

    这就是区别。

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 2015-03-07
      • 2017-11-11
      相关资源
      最近更新 更多