Ruby或ROR - 由'||分隔的函数参数

时间:2011-08-03 00:26:23

标签: ruby-on-rails ruby

我刚刚遇到一段有趣的代码。我想确定它是红宝石标准还是铁轨惯例。

redirect_to(session[:return_to] || users_path)

这可以防止redirect_to:在某些情况下导致错误。在c ++中,类似的东西意味着一个bool参数的函数。但在这里它似乎以另一种方式工作 - 我认为这个论点不是一个零。有人可以向我解释并显示这样一个函数的示例定义,它将参数分隔为'||'吗?

再见

4 个答案:

答案 0 :(得分:6)

||&&等布尔运算符返回最后一次计算的语句。

一个例子,

puts "hi" && "no"

上面将打印“no”,因为两个字符串都被认为是'truthy'而“no”是最后一个被调用的值。

在这种情况下,程序员正在利用||运算符的短路特性。另一个例子,

puts "hi" || "no"

以上将输出“hi”,因为“hi”被认为是真实的或者是短路的“hi”是从表达式调用的最后一个值并将被返回。

你会在ruby中看到这种构造很多,尤其是if s。

a = if true
  "A will be set to this string"
else
  "This will never happen"
end

puts a #=> A will be set to this string

编辑:正如尼克所提到的,重要的是要注意只有nilfalse被视为“虚假”。一些有趣的例子

a = nil || "hi"
puts a #=> "hi"
a = false || "hi"
puts a #=> "hi"

在这两种情况下,第一个参数是“falsy”,因此评估并返回“hi”(然后分配给a)

a = Object.new || "hi"
puts a #=> <Object:0x10832420>

在这种情况下(对于作为第一个参数的任何其他值),Object.new为“true”,因此永远不会评估“hi”。在您的特定示例中,作者很可能正在测试session[:return_to]的存在(而不是零)。这可能非常有用,但请始终记住,如果false是有效值,它可能无法正常工作。

答案 1 :(得分:3)

这称为Short-Circuit Evaluation,在许多编程语言中都很常见

用简单的英语,你的陈述说

  

“重定向到会话[:return_to]如果存在,如果不存在,则重定向到users_path”

答案 2 :(得分:2)

如果redirect_to(session[:return_to])是真实的(例如,不是session[:return_to]nil),则会调用false

如果session[:return_to]是假的,则会调用redirect_to(users_path)

请参阅http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators#Logical_Or

答案 3 :(得分:1)

逻辑OR是短路的,这意味着如果左侧是“真”或非零,那么整个表达式的值是左侧,右侧是从未考虑过。因此,如果session[:return_to]是非零的,那么它就是表达式的值。但是,如果它是nil,则表达式的值是右侧的值,即user_path的值。

你甚至可以写x || x = "foo"之类的东西,在这种情况下x只有在开始时才会被重新分配,但如果它是非零则不会被触及。

至于函数,它只需要一个字符串,而不关心你插入参数的内容。