小编vek*_*sev的帖子

在数组上使用累加器映射

我在寻找创造一个方法Enumerable,做map,并inject在同一时间。例如,调用它map_with_accumulator

[1,2,3,4].map_with_accumulator(:+)
# => [1, 3, 6, 10]
Run Code Online (Sandbox Code Playgroud)

或用于字符串

['a','b','c','d'].map_with_accumulator {|acc,el| acc + '_' + el}
# => ['a','a_b','a_b_c','a_b_c_d']
Run Code Online (Sandbox Code Playgroud)

我无法找到解决方案。我想我可以用reduce. 我正在沿着以下路径工作:

arr.reduce([]) {|acc,e| ..... }
Run Code Online (Sandbox Code Playgroud)

初始值是一个空数组,但我无法正确理解。

编辑:有关正确的解决方案,请参阅下面 Jörg 的回答。阅读他的答案后,我意识到另一种(有点粗暴的)方法是使用instance_eval,它将给定块的上下文更改为执行它的对象的上下文。Soself被设置为引用数组而不是调用上下文(这意味着它不再是一个闭包!)inject并且shift被数组调用。令人费解,不必要的简洁,读起来令人困惑,但它教会了我一些新的东西。

['a','b','c','d'].instance_eval do
  inject([shift]) {|acc,el| acc << acc.last+el}
end
#=> ['a','ab','abc','abcd']
Run Code Online (Sandbox Code Playgroud)

ruby inject

5
推荐指数
1
解决办法
1325
查看次数

标签 统计

inject ×1

ruby ×1