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

多分それはあなたが求めているものではないかもしれませんが、少なくとも読みやすいです:

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 に答える
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 に答える