在.map代码块中引用.map返回对象(数组)



在Ruby中,是否可以从.map代码块中引用.map函数生成的数组对象?

一个非常简单的例子是,如果您试图只向返回的数组中添加唯一的元素,并希望检查该元素是否已经存在,这可能看起来像:

array.map{ |v| v unless (reference to array being created by this map function).include?(v) }

我知道这段代码在功能上是不必要的,因为你可以简单地在数组上使用.uniq方法或将值推入一个单独的数组并检查该数组是否已经包含该值,我只是想知道在概念上是否可能,因为我遇到过几次这样的引用将是有用的。谢谢。

据我所知在地图上没有。但是,您可以使用reduceinject来引用集合。所以:

array.reduce([]) {|memo, v| memo << v unless memo.include? v; memo }

还是……

array.inject([]) do |memo, v| 
    memo << v unless memo.include? v
    memo
end

为了澄清关于reduce的一些问题,reduce的最终返回值变成memo,但是如果你返回v而不是memo, v就变成memo,它第一次传递给像[1,2,3,2,1]这样的数组将是1。然后你的聚合结果就会被删除。因此,您需要将其添加到聚合并返回聚合。

值得注意的是:我同意大多数评论者的意见,uniq是更好的方法,因为它似乎更清楚地表达了意图,而且从性能的角度来看也是如此。

#inject是最常见的答案,但是您也可以考虑#each_with_object

[1,1,3,4].each_with_object([]) {|v, o| o.push(v) unless o.include?(v) }
=> [1, 3, 4]

我认为如果:

array.map{ |v| v unless (reference to array being created by this map function).include?(v) }

你应该直接写:

array.uniq

最新更新