2014-10-20 93 views
-2

我正在浏览一些用于验证的代码。我无法理解使用&&在下面的语句:&&红宝石运算符

user = user_token && User.find_by_authentication_token(user_token.to_s) 

我试着用导轨控制台和IRB。他们都返回了第二个值。任何人都可以解释为什么它被使用?

+0

确保'user_token'不是零 – apneadiving 2014-10-20 10:08:17

+0

是的,但不应该'&&&运算符返回true或false? 我对ruby和rails非常陌生,所以我可能会错过一些基础知识。 – level0 2014-10-20 10:10:36

回答

2

你说得对,&&是一个逻辑运算符,但并不意味着它会返回true或false。这里的主要特点是,如果左表达式评估为falsy值,则不执行右手操作。你可以这样想:它不被评估,因为它不需要知道&&表达式的逻辑值 - 如果左边的表达式是虚假的,falsy && anything是虚假的,所以不需要评估右边的表达式。

由于红宝石每个表达式返回最后执行的子表达式的值(不是真正的东西,但会帮助你理解这个概念),expr1 && expr2如果它falsy将返回expr1值(expr2不计算)或值为expr2如果expr1是真的。当然,您可以使用&&||链表达式。

如果是||,则逻辑相同 - 如果LH表达式值足以确定整个表达式的错误,则不要评估RH表达式。在||情况下,如果右手表达truthy,整个表达式是truthy无论RH的,所以它通常用来设置默认值:

variable = options[:key] || 'Default if options[:key] is false or nil' 
+0

哇!真棒解释:) ..你刚刚清除我所有的疑虑...想投票这一个..但没有足够的声誉 – level0 2014-10-20 11:12:53

+1

阿迪尔,你可以有我的upvote。 – 2014-10-20 19:52:17

0

这可以被改写为

if user_token.nil? 
    user = nil 
else 
    user = User.find_by_authentication_token(user_token.to_s) 
end 

因此在代码中,我们只是确保user_token设置,是不是nil

+1

明白了..非常感谢:),..看起来我需要再次做基础知识: – level0 2014-10-20 10:15:08