如何将此循环减少为单行代码?

时间:2014-04-17 09:15:32

标签: ruby

我需要将以下代码写在一行上。它对我来说很难看:

@photos = []
@vehicle.photos.each { |p| @photos << view_context.present(p) }

我该怎么办?

3 个答案:

答案 0 :(得分:8)

迭代可枚举对象(@vehicle)的模式,将函数应用于每个元素(view_context.present(p)),并将结果附加到新创建的数组(@photos)是由map方法封装:

@photos = @vehicle.photos.map { |p| view_context.present(p) }

答案 1 :(得分:3)

你也可以使用注入,这很容易理解。 inject方法接受一个参数和一个块。对于包含在对象中的每个元素,块将被执行一次,传递给inject的参数将作为块的第一个参数,第一次被执行。产生于块的第二个参数将是我们称为注入的对象的第一个元素。

@photos = @vehicle.photos.inject([]) { |res, p| res << view_context.present(p) }

更多详情here.

您也可以使用each_with_object,这对于可变对象更有效,例如toro2k建议的ArrayHashString。在这种情况下,代码将如下所示: -

@photos = @vehicle.photos.each_with_object([]) { |p,res| res << view_context.present(p) }

答案 2 :(得分:1)

map的较短版本(或可能不是。但没有花括号和管道)

 @photos = @vehicle.photos.map &view_context.method(:present)