2010-12-12 3 views
0

막연한 질문에 대해 죄송합니다. 나는이 현상을 묘사하는 말을 잃어 버렸기 때문에 구글은별로 도움이되지 못했다.루비가 이런 식으로 변수를 변경하는 방법은 무엇입니까?

array = [["name", "age"]] 
a = [] 

x = ["Joe 32", 
    "Tom 45", 
    "Jim 36"] 

x.each do |line| 
    name, age = line.split(/\s/) 
    a[0] = name 
    a[1] = age 

    array.push(a) 
end 

array.each do |x| 
    puts x.join(" ") 
end 

이 생산 : 다음 코드를 고려하십시오

name age 
Joe 32 
Tom 45 
Jim 36 

arraya을 수정하여 사후 영향 : 내가 기대 한 것과 반대되는

name age 
Jim 36 
Jim 36 
Jim 36 

?

답변

5

aeach 안에있는 새 Array 개체로 설정하려고합니다. 현재 같은a 개체를 배열에 밀어 넣기 때문에 동일한 값을 세 번 반환합니다. 더 좋은 점은 전혀 a를 사용하는 대신에 이런 일에 코드를 변환하지하는 것입니다 :

x.each do |line| 
    name, age = line.split(/\s/) 
    array.push([name, age]) 
end 

당신은 심지어 push 방법 이내로하는 line.split를 이동하여 그것보다 작게 만들 수 있지만, 나는 생각 가독성을 떨어 뜨리며 어떤 정보가 split에서 나왔는지 설명하지 않습니다.

+1

그래를 제공

array.each_with_index do |object, index| puts "Object #{index} (which is #{object.inspect}) has an object id of #{object.object_id}" end 

, 당신이 경우에도 포인터를 이해해야한다 : 제쳐두고, 당신은, 당신은 각 개체에 object_id를 사용할 수 있습니다 라이언의 답변을 확인하기를 원한다면으로

그들은 포인터라고 부르지 않습니다. –

+0

원본은 왜 그랬는지 아직도 이해할 수 없지만 작동합니다. 포인터를 살펴 보겠습니다. 감사합니다 – jack

0

이 약간 더 고급이 아니라

x.each do |line| 
    name, age = line.split(/\s/) 
    array.push([name, age]) 
end 

하는 것보다, 라이언의 대답에 구축, 당신은 map 기능을 사용할 수 있으며,이 "조금 더있다

people = x.map do |line| 
    name, age = line.split(/\s/) 
    [name, age] 
end 

desired_result = [["name", "age"]] + people 

이 기능적 프로그래밍 "접근 방식을 사용합니다. 이것은 매우 대략적인 요약이지만, 함수형 프로그래밍에서는 기존 객체를 수정하지 않고 새로운 객체 만 생성합니다.

Object 0 (which is ["name", "age"]) has an object id of 10204144 
Object 1 (which is ["Jim", "36"]) has an object id of 10248384 
Object 2 (which is ["Jim", "36"]) has an object id of 10248384 
Object 3 (which is ["Jim", "36"]) has an object id of 10248384 
+0

감사합니다 앤드류. 나는 Ruby로 함수형 프로그래밍을 살펴 보았다. 이것은 그렇게하는 좋은 예입니다. – jack

+0

@jack : 열거 형 열거 형은 내가 좋아하는 일련의 블로그 게시물입니다. –

관련 문제