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

감사합니다. 나는 비슷한 것을 사용할 것이다. 나는 꽤 확신한다. 아마 실제 코드에서 a와 b는 h에 대한 참조를 기반으로 초기화되므로, h에 대한 each_with_object는 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 

편집를 결정할 수 있습니다 : 이것은 당신이 each_with_object을 이해하지 ... 아마도 초기 솔루션은입니다 읽고 꽤 어렵다 최선의 접근법.

+0

위법 한 행동은 아니지만 이것은 끔찍한 행동입니다. 그것이 OP가 요구하는 것처럼 보입니다. –

+1

@ KL-7 동의합니다. 나는 이렇게하지 않을 것이다. 방공호 질문에 대답하는 것뿐입니다. – Kyle

+0

끔찍한 점에 대해 자세히 설명해 주시겠습니까? 나는 배울 것을 요구하고있다. 그래서 만일 나의 접근 방식이 벗어난다면, 나는 나쁜 목표를 달성하는 것보다 훨씬 새로운 접근법을 원할 것이다. – asfallows