在使用tap和yield导入之前修改CSV行

时间:2017-03-26 16:25:31

标签: ruby-on-rails ruby csv

我正在开发一个开源项目的功能。 在某些时候导入CSV文件,我从中创建一个数组,以便在新对象中传递它。 之后

@property

这用于获取代码块

class ProductSearch(BaseModel):
     # ....
     @property
     def product_favorite_set(self):
           return Favorite.objects.filter(product=self.product)

我的问题是,如何访问导入的数据? 在CSV.open(path, 'rb', opts) 之后有一个方法序列。

编辑: 我不想重写它我想测试它。我知道我应该使用tap来修改数据,但我不知道该怎么做,因为我没有看到任何方法来引用CSV的数据

1 个答案:

答案 0 :(得分:1)

此时与文件操作实际上没有任何关系。它更多的是了解#tap如何阻止工作。

def block
  [1, 2, 3, 4, 5].tap { |array| yield array if block_given?}
end
block { |array| array.each{ |element| puts element } }

输出:

1
2
3
4
5

在方法block中,数组[1, 2, 3, 4, 5]被初始化,之后我们tap进入该数组,这使得该数组在tap的块中可用。

在上面的示例中,当[1, 2, 3, 4, 5]传递给tap时,它在array变量中可用,其变量如下所示:|array|。然后,array将获得块if block_given?。这意味着新块|array|中也包含[1, 2, 3, 4, 5]。因此,在传递给tap的新块中,您可以修改该数组,或者像我一样输出它。