2012-06-27 4 views
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 не будет достаточно, но Я не уверен, что мне нужно. Мой код работает, но он не выглядит очень румяным. Что я должен здесь делать?

ответ

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) 

Хотя, как вы сказали, что ваш пример является упрощением реальной задачи, поэтому он не может работать вы. В этом случае я бы рекомендовал остаться с вашим оригинальным решением.

+0

+1 Вот как я это сделаю. – Kyle

+0

Спасибо. Я буду использовать что-то похожее, я уверен. Я, вероятно, упростил мой пример - в фактическом коде, а и b инициализируются на основе ссылок на то, что находится в h, поэтому я думаю, что each_with_object на h, за которым следует создание a и b, удалит пустые inits без ухудшения удобочитаемости. – asfallows

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 

EDIT: Это очень трудно читать, если вы не понимаете each_with_object ... возможно, ваш исходный раствор является лучший подход.

+0

Не обижайтесь, но это ужасно. Хотя, похоже, это то, о чем просит ОП. –

+1

@ KL-7 Я согласен. Я бы так не сделал. Просто отвечая на вопрос ОП. – Kyle

+0

Не могли бы вы рассказать о том, что делает его ужасным? Я прошу учиться, поэтому, если мой подход уйдет, я бы предпочел новый подход, чем то, что достигает плохих целей. – asfallows

Смежные вопросы