2011-06-12 170 views
0

嘿,我偶然发现了Michael Hartl的railstutorial,当时我偶然发现了这段代码。&&使用三元运算符

有没有人知道三元运算符使用“用户& &”?

下面的代码:

def self.authenticate(email, submitted_password) 
    user = find_by_email(email) 
    user && user.has_password?(submitted_password) ? user : nil 
end 
+0

[Ruby的双符号]的可能重复(http://stackoverflow.com/questions/1987955/double-ampersand-in-ruby) – 2011-06-14 00:54:23

回答

7

&&是合乎逻辑的and,只是它的优先级高于and。所以声明只是说如果用户不是零,并且用户有该密码然后返回用户,否则返回零。

在Ruby中,逻辑的第二部分,如果第一部分为假,则不执行。所以这里的目的是确保在拨打has_password?之前有用户,从而防止在nil上调用has_password?的错误。另一种方式做,这是使用try,如:

user.try(:has_password?, submitted_password) ? user : nil 
+1

很好的事情要知道:基于参数的值跳过部分逻辑表达式的概念被称为[短路评估](http://en.wikipedia.org/wiki/Short-circuit_evaluation)。对于可能有副作用的表达部分,请务必小心谨慎。也就是说,完全避免这些。 – 2011-06-15 12:46:40

1

它只是检查是否有user应用该方法has_password?在它之前的任何值。