0

我正在研究无脂肪 CRM 的源代码。我试图了解其中一个应用程序助手中的这一特定代码行的作用:

options[:selected] = (@account && @account.id) || 0

似乎将选项散列:selected的值设置为实例变量的值@account0(如果@account不存在)。

&& @account.id做什么?

4

4 回答 4

7

它确保@account不是假的,如果不是,它会将选项设置为帐户的id. 写成长手它相当于这样:

options[:selected] = if @account && @account.id
                       @account.id
                     else
                       0
                     end

或者

options[:selected] = (@account && @account.id) ? @account.id : 0

我可能会使用使它看起来像这样andandgem :

options[:selected] = @account.andand.id || 0
于 2013-07-26T17:50:41.737 回答
0

相当于写作,

options[:selected] = (@account != nil ? (@account.id != nil ? @account.id : 0) : 0)

但是,Ruby 程序员更喜欢您在问题中指出的方式,因为您可以看到上面的代码可能变得非常不可读。此外,Ruby(和其他动态编程语言,如 JavaScript)具有真值和假值的概念,这允许人们编写简洁且更具可读性的代码。你可以在这篇文章中阅读到这一点:真理问题

于 2013-07-26T17:52:22.637 回答
0

由于确保对象不为 nil 是一个非常常见的问题,因此在 rails 中有一种方法(但不是直接在 ruby​​ 中):

options[:selected] = @account.try(:id) || 0

try(:id)将返回nilif @accountis nilorfalse并且将:id@account任何其他情况下调用。这也意味着如果对象不是 nil 或 false 并且不响应 id,它将引发错误。

于 2013-07-26T21:18:26.263 回答
0
options[:selected] = (@account && @account.id) || 0

这行代码不会设置options[:selected]@accountor 0,而是设置为@account.idor 0。原因是(@account && @account.id)它将返回最后评估的语句,@account.id如果两者都为真。

正如其他人所说,(@account && @account.id)将首先验证@account实际存在;如果确实如此,由于短路,它将检查是否@account.id存在,如果存在则设置options[:selected]为它。但是,@account如果不存在,则该值将设置为 0。

于 2013-07-27T01:43:26.860 回答