2012-03-10 3 views
1

제목에서 말한 것처럼 ... 배열에 하위 배열이 포함되어있는 경우 배열을 분할하고 새 분할 배열의 이름을 바꿀 수 있습니까? 나는 단순히 new_array = array [0]을 입력 할 수 있다는 것을 알고 있지만, 문제는 서브 배열을 포함하는 원래 배열의 크기가 다양하다는 것입니다. Ruby - 분할 및 이름 바꾸기 하위 배열

array1=["a", "1", "2", "3"] 
array2=["b", "1", "2", "3"] 
array3=["c", "1", "2", "3"]... 

나는 그 말이 희망

원래 배열 ...

array=[["a", "1", "2", "3"], ["b", "1", "2", "3"], ["c", "1", "2", "3"]...] 

분할 및 이름 배열 ... 감사 프랭크

+1

:

흥미롭게도 평가 (그리고 각 블록)이 최상위 범위와 공유되지 않은 자신의 범위를 가지고 있기 때문에이 작동하지 않습니다 아니면 그냥 숙제 문제일까요? 나는 당신이 무엇을 요구하고 있는지 이해하고 있으며, mu는 너무 짧아서 합리적인 해결책을 제공하지 못하지만, 당신이 이것을 달성하기 위해 노력하고있는 것이 있다면, 어떤 맥락이 도움이 될 것입니다. –

답변

1

나는 말 그대로 당신이 찾고있는 무엇을 볼 수있는 유일한 방법은 다음과 같습니다 : 당신이 그렇게 경사 인 경우에 당신은 간단하게 뭔가 동일한 구조를 만들 수

array=[["a", "1", "2", "3"], ["b", "1", "2", "3"], ["c", "1", "2", "3"]] 

array.each_with_index do |element, i| 
    instance_variable_set "@array#{i + 1}", element 
end 

puts @array1 # => ["a", "1", "2", "3"] 
puts @array2 # => ["b", "1", "2", "3"] 

그러나 물론 이것은 매우 추악합니다. 이것을 절대적으로 필요로하지 않는다면 배열을 변수 목록으로 변환하지 않고 배열을 사용하는 방법을 찾아야합니다. 일반적으로 해시로 변환 할 필요는 없습니다. 하나의 색인 스타일을 다른 색인 스타일로 변환하는 것일 뿐이며 추가 기능을 제공하지 않습니다. 기초 실제 사용 사례가 있습니까

array.each_with_index do |element, i| 
    eval("array#{i + 1} = element") 
end 

puts array1 # => NameError 
+0

늦게 답장을 보내 주셔서 죄송합니다. 지금까지 시도하지 않으 셨습니다. 내가 요청한 것과 정확히 맞은 도움을 주셔서 감사합니다. 조금 혼란스럽고 혼란 스럽지만, 제가 생각할 수있는 유일한 생각입니다. 생각할 수있는 유일한 방법은 하위 배열의 하위 요소에 액세스하는 것입니다. 예 : "a", "b", "c"값을 새 배열 또는 개별적으로 가져옵니다. 이해가 되니 ??? – JoMojo

+0

당신은'@ array1 [0]'(= "a"),'@ array1 [1]'(= "1") 등을 할 수 있습니다. – user2398029

+0

아니오, 정확하게는 아닙니다. 내 OP ... array = [[ "a", "1", "2", "3"], [ "b", "1", "2", "3" [ "c", "1", "2", "3"] ...]. array [0] = [ "a", "1", "2", "3"]을 반환하는 배열 [0]을 사용하여 서브 배열을 얻을 수 있다는 것을 알고 있습니다. 그런데 어떻게 거기에서 요소 "a"를 얻을 수 있습니까? 배열 [0, 0] = "a", 배열 [0, 1] = "1"... 죄송합니다. 설명이 혼란 스럽지만 미안하지만, :) – JoMojo

1

당신은 어떤 공상을 할 수 - 바지를 사용하여 하위 배열을 유지하는 일련의 변수를 만들었지 만 새로운 변수를 다루기 위해서는 좀 더 혼란스러운 바지를 사용해야합니다.

arrays = Hash[array.inject([]) { |m, a| m << ["array#{m.length + 1}", a] }] 

arrays 당신이를 줄 것이다 :

{ 
    "array1" => ["a", "1", "2", "3"], 
    "array2" => ["b", "1", "2", "3"], 
    "array3" => ["c", "1", "2", "3"] 
} 

을하고 그건 당신이 동적으로 변수의 무리를 만들 생각 할 때마다, 당신은 일반적으로 작은 휴대용 네임 스페이스로 해시를 만들려면 실행하기 전까지는 이름을 알 수없는 수많은 새 변수보다 작업하기가 훨씬 쉽습니다.

arrays = { } 
array.each_with_index { |a, i| arrays["array#{i + 1}"] = a } 
+0

답장을 보내 주셔서 감사합니다 뮤가 너무 짧습니다 ... 나는 당신의 제안을 시도하고 다소 효과가 있지만 배열로 이름이 바뀐 배열을 검색 할 필요가 있습니다. 예를 들어 array1을 사용할 수 없습니다. 이 정도까지 배열을 조작하려고하면 나에게 매우 새로운 것을 명심하십시오. – JoMojo

+0

@FrankN :하지만 배열에 어떤 키가 있는지 물어볼 수 있습니다. 'array11' 변수를 동적으로 생성했다면, 어떤 변수 이름을 가지고 있었는지 어떻게 알 수 있습니까? 그리고 11 개가 있다는 것을 알게되면 이름만으로 변수에 액세스 할 수있는보다 동적 인 조작을해야합니다. 동적으로 변수를 생성하는 대신 해시를 사용하여 모든 작업을 건너 뛸 수 있습니다. 해시를 사용하면 이름 충돌과 충돌을 피할 수 있습니다. 정보에 대한 감사합니다 –

+0

. 나는 해시가 어떻게 작동하는지 잘 모른다. 그러나 나는 그것들을 들여다 볼 것이다. 아마도 내가 필요로하고 그것을 결코 알지 못했을 것이다. :) 나는 이것이 내 머리 위로 조금이라도 인정하지만, 새로운 것을 배우고 결과를 얻으려는 것이 멋지다 ... – JoMojo