我正在研究无脂肪 CRM 的源代码。我试图了解其中一个应用程序助手中的这一特定代码行的作用:
options[:selected] = (@account && @account.id) || 0
似乎将选项散列:selected
的值设置为实例变量的值@account
或0
(如果@account
不存在)。
在&& @account.id
做什么?
我正在研究无脂肪 CRM 的源代码。我试图了解其中一个应用程序助手中的这一特定代码行的作用:
options[:selected] = (@account && @account.id) || 0
似乎将选项散列:selected
的值设置为实例变量的值@account
或0
(如果@account
不存在)。
在&& @account.id
做什么?
它确保@account
不是假的,如果不是,它会将选项设置为帐户的id
. 写成长手它相当于这样:
options[:selected] = if @account && @account.id
@account.id
else
0
end
或者
options[:selected] = (@account && @account.id) ? @account.id : 0
我可能会使用使它看起来像这样的andand
gem :
options[:selected] = @account.andand.id || 0
相当于写作,
options[:selected] = (@account != nil ? (@account.id != nil ? @account.id : 0) : 0)
但是,Ruby 程序员更喜欢您在问题中指出的方式,因为您可以看到上面的代码可能变得非常不可读。此外,Ruby(和其他动态编程语言,如 JavaScript)具有真值和假值的概念,这允许人们编写简洁且更具可读性的代码。你可以在这篇文章中阅读到这一点:真理问题。
由于确保对象不为 nil 是一个非常常见的问题,因此在 rails 中有一种方法(但不是直接在 ruby 中):
options[:selected] = @account.try(:id) || 0
try(:id)
将返回nil
if @account
is nil
orfalse
并且将:id
在@account
任何其他情况下调用。这也意味着如果对象不是 nil 或 false 并且不响应 id,它将引发错误。
options[:selected] = (@account && @account.id) || 0
这行代码不会设置options[:selected]
为@account
or 0,而是设置为@account.id
or 0。原因是(@account && @account.id)
它将返回最后评估的语句,@account.id
如果两者都为真。
正如其他人所说,(@account && @account.id)
将首先验证@account
实际存在;如果确实如此,由于短路,它将检查是否@account.id
存在,如果存在则设置options[:selected]
为它。但是,@account
如果不存在,则该值将设置为 0。