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