0

我正在寻找解决问题的 Ruby-est 方法。

我的应用程序中有与此类似的代码:

data = [1,2,3,4]
a = []
b = []
h = {}
data.each do |val|
  h[val] = func1(val)
  a.push func2(val)
  b.push func3(val)
end

当然,这是一种简化。给定这样的代码,我想做的是消除此代码段的第 2-4 行,以便我有类似的内容:

 h, a, b = data.some_func{|val|
   # do something
 }

我的直觉是这map还不够,但我不确定我需要什么。我的代码有效,但看起来不是很红。我应该在这里做什么?

4

2 回答 2

2

我认为我的例子不是最好的,但是......你可以决定

h, a, b = data.each_with_object([ {}, [], [] ]) do |val, obj|
  obj[0][val] = func1 val
  obj[1] << func2(val)
  obj[2] << func3(val)
end

编辑:除非您了解each_with_object,否则这很难阅读……也许您的初始解决方案是最好的方法。

于 2012-06-27T14:32:38.793 回答
2

也许这不完全是您所要求的,但至少它是可读的:

data = [1,2,3,4]
h = data.each_with_object({}) { |e, m| m[e] = func1(e) }
a = data.map &method(:func2)
b = data.map &method(:func3)

但是,正如您所说,您的示例是对实际任务的简化,因此它可能对您不起作用。在这种情况下,我建议保留您的原始解决方案。

于 2012-06-27T14:41:22.500 回答