【发布时间】:2013-08-29 23:52:49
【问题描述】:
我期待9,但得到nil。不知道为什么。
> dfs = p.disk_items.inject { |acc, di| acc + 1 if di.type == "DiskFile" }
=> nil
同样的问题:
> dfs = p.disk_items.inject(0) { |acc, di| if di.type == "DiskFile" then acc + 1 end }
=> nil
很明显,di.type == "DiskFile" 为真有九次:
> dfs = p.disk_items.inject(0) { |acc, di| puts di.type == "DiskFile" }
true
true
true
true
true
true
true
true
true
false
=> nil
我在搞砸什么?如果我不能使用条件,那么也许有更好的方法来计算数组中满足属性条件的所有 ActiveRecord 对象。
编辑:FWIW:
> p.disk_items.class
=> ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_DiskItem
看起来this implementation in Rails source 的count 可能不接受块?虽然我可能读错了或者看错了地方......
【问题讨论】:
-
当
if“不运行”时,块评估为nil。 -
嗯,所以如果块评估为零,
acc应该仍然有一个值,我认为这是inject返回的值?!?无论如何,有没有更好的方法来做到这一点? -
值 [returned] 现在是
nil- 结果(或下一个 acc 将是nil)。是的,有更好的方法。更新了我的答案。
标签: ruby-on-rails ruby iterator inject