Ruby:使用Enumerable的inject方法封装一个操作

时间:2015-12-25 20:44:14

标签: ruby

我对一堆数组进行了这样的操作:

obj = MyObject.new
[[
  #data
 ],
 [
  #data
 ],
 # ...
].inject(obj) do |memo, i|
    memo.foo_method AnotherObject.new(i[0],i[1])
  end      

永远不会改变的是注射操作本身。如果它可以以正确的方式隐藏在辅助方法中呢?如下所示:

def my_helper_method(obj,arr)
  # obj is MyObject's instance,
  # arr - an array from the external array
  inject(obj) do |memo, i|
    memo.foo_method AnotherObject.new(i[0],i[1])
  end
end

[[
  #data
 ],
 [
  #data
 ],
 # ...
].each(&:my_helper_method)       

如何将两者传递给辅助方法:MyObject的实例和项目?将方法转换为块时是否可以执行?

1 个答案:

答案 0 :(得分:2)

根据您在问题中分享的功能定义,您应该使用如下所示的内容。而且,您的功能应该使用arr.inject而不仅仅是inject

arr = [[
  #data
 ],
 [
  #data
 ],
 # ...
]

obj = MyObject.new

my_helper_method(obj, arr)

但是,如果您想让inject块内的代码可重复使用,您可以使用Proc,如下所示:

block = Proc.new { |memo, i| p "Put your code here...#{memo} #{i}" }

[[
  "s"
 ],
 [
  "p"
 ],
 # ...
].inject(MyObject.new, &block) 

如果您不喜欢Proc并想要使用此功能,您可以执行以下操作:

def f memo, i
    p "put your code here... #{memo} #{i}"
end

[[
  "s"
 ],
 [
  "p"
 ],
 # ...
].inject(MyObject.new, &method(:f))