我很好奇为什么它们会产生不同的输出.所需的输出是ActiveRecord记录的array.

当使用内联块时,它看起来像是在执行ActiveRecord查找,但随后将原始数组(减go reject个元素)嵌套在另一个数组中,并将嵌套数组追加到变量中.

使用多行块时,会发生预期的行为,即发生ActiveRecord查找,并将标识的记录附加到变量.

x = []
y = ["", "1353", "1155"]
x << y.reject!(&:empty?).each { |i| User.find(i) }
# => ["1353", "1155"]
x
#=> [["1353", "1155"]]

VS

x = []
y = ["", "1353", "1155"]
y.reject!(&:empty?)
y.each do |i|
  x << User.find(i)  
end  
# => ["1353", "1155"]
x
#=> [#<User:0x00007fc7fbacc928
#  id: 1353,
#  login: nil,
...

推荐答案

不同之处在于.each返回数组本身,因此

[1,2,3].each { nil }
# [1,2,3]

因此,您在X中添加了被拒绝的Y数字,而您的.each在第一个示例中毫无用处(这也是它是一个数组数组的原因,因为‘<;<;’将元素数组插入到数组中,而不是所有单个元素).


在您的第二个示例中,您的‘each’实际上是将元素附加到块内的数组中,因此没有"返回"依赖.如果您想要在单行上完成,您必须这样做

y.reject(&:empty?).each { |i| x << User.find(i) }

因此,它将在de块内进行计算,如果希望每个循环返回块内的值,则应该使用‘map’而不是‘each’,并使用‘conat’或‘+’对数组求和(因此它对每个单独的元素求和或连接),因此

x.concat(y.reject(&:empty?).map{ |i| User.find(i) })

OBS:正如@Tadman在 comments 中建议的那样,我还go 掉了Reject的"刘海",因为它是"Reject!"方法不期望总是返回所有值,请查看他的注释以了解更多信息

Ruby-on-rails相关问答推荐

为Rails服务器推荐的交付类型

如何在测试期间为 Rails 应用程序启用 Rails.cache 会话对象

select2 未应用于所有下拉列表;它只适用于数据的最后一条记录

Rspec期望()与期望{}

blueprint/screen.css 未预编译

Ruby/Rails 中的类方法与常量

查找日期时间与今天匹配的记录 - Ruby on Rails

如何在 Rails 迁移中添加判断约束?

rails 4.0, rake db:sessions:create

Rails - 生产模式下的错误

activerecord 查找所有未包含在数组中的内容

使用god 监控独角兽 - 以非零代码开始退出 = 1

未捕获的类型错误:未定义不是函数- 初学者 Backbone.js 应用程序

保存后重定向到索引而不是显示

表单中的第一个参数不能包含 nil 或为空 - Rails 4

Ruby on Rails i18n - 想要在模型中翻译自定义消息

在rails国际化yml文件中传递变量

Coffeescript ||= 模拟?

将新管理员添加到活动管理员

Rails.cache 在测试之间被清除了吗?