0

我期待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

看起来Rails 源代码中的这个实现count可能不接受块?虽然我可能读错了或者看错了地方......

4

2 回答 2

3

user2246674 是正确的,if 语句返回 nil,但注入应该始终返回acc您可以使用 turnery 运算符来简化此操作

dfs = p.disk_items.inject(0) { |acc, di| di.type == "DiskFile" ? acc + 1 : acc  }
于 2013-08-29T23:59:58.313 回答
1

if“不运行”块评估为nil. 这发生在最后一种情况下,并nil返回结果 ( )。

考虑(长手):

if di.type == "DiskFile" then
    acc + 1
else
    acc      # so we never return nil
end

虽然有各种速记(即 ?:),但我会使用count {block}. 如果需要对这些值做其他事情(可能仍在“有时”注入中使用),select也可能有用。

p.disk_items.count {|di| di.type == "磁盘文件"}

于 2013-08-29T23:59:16.997 回答