我刚刚遇到一段有趣的代码。我想确定它是红宝石标准还是铁轨惯例。
redirect_to(session[:return_to] || users_path)
这可以防止redirect_to:在某些情况下导致错误。在c ++中,类似的东西意味着一个bool参数的函数。但在这里它似乎以另一种方式工作 - 我认为这个论点不是一个零。有人可以向我解释并显示这样一个函数的示例定义,它将参数分隔为'||'吗?
再见
答案 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
编辑:正如尼克所提到的,重要的是要注意只有nil
和false
被视为“虚假”。一些有趣的例子
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
只有在开始时才会被重新分配,但如果它是非零则不会被触及。
至于函数,它只需要一个字符串,而不关心你插入参数的内容。