在Ruby中,是否可以从.map
代码块中引用使用.map
函数生成的数组对象?
一个非常简单的例子是,如果您尝试仅向返回的数组添加唯一元素,并想检查该元素是否已存在,可能如下所示:
array.map{ |v| v unless (reference to array being created by this map function).include?(v) }
我知道功能上这段代码是不必要的,因为你可以简单地在数组上使用.uniq
方法或将值推送到一个单独的数组中并检查该数组是否已包含该值,我只是想知道它是否是可能在概念上,因为我曾经遇到过几次这样的参考有用的地方。感谢。
答案 0 :(得分:1)
据我所知,在地图中。但是,您可以使用reduce
或inject
来引用该集合。所以:
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