2015-12-25 54 views
0

的操作我有一堆數組的數組來完成這樣的操作:紅寶石:封裝與可枚舉的方法注入

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的實例和一個項目?當一個方法轉向一個塊時,有沒有可能做到這一點?

回答

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)) 
+0

最後瓦里安t正是我尋找的解決方案。謝謝! – DreamWalker