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

时间:2014-05-25 23:56:20

标签: ruby arrays loops iteration enumerable

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

一个非常简单的例子是,如果您尝试仅向返回的数组添加唯一元素,并想检查该元素是否已存在,可能如下所示:

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

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

3 个答案:

答案 0 :(得分:1)

据我所知,在地图中。但是,您可以使用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的最终返回值变为备忘录,但是如果你返回v而不是memo,则v成为备忘录,它首先传递给像[1的数组] 2,3,2,1]将为1.那么您的聚合结果将被删除。因此,您需要将其添加到聚合并返回聚合。

值得注意:我同意大多数评论者的意见,uniq是更好的方式,因为它似乎是一个更明确的意图陈述,但也从表现的角度来看。有关详细信息,请参阅this gist

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我认为如果:

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

你应该写:

array.uniq
相关问题