我需要将以下代码写在一行上。它对我来说很难看:
@photos = []
@vehicle.photos.each { |p| @photos << view_context.present(p) }
我该怎么办?
答案 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建议的Array
,Hash
,String
。在这种情况下,代码将如下所示: -
@photos = @vehicle.photos.each_with_object([]) { |p,res| res << view_context.present(p) }
答案 2 :(得分:1)
map
的较短版本(或可能不是。但没有花括号和管道)
@photos = @vehicle.photos.map &view_context.method(:present)