2013-08-29 2 views
-3

저는 Ruby에 익숙하지 않아 해시 인수를 배우는 중입니다. 난 그냥 해시 인수를 사용하는 경우 값을 반환하는 방법에 대한 질문이Ruby에서 해시 인수로 값을 반환하는 더 좋은 방법이 있습니까?

다음 코드와 같은 해시 인수 test_method라는 메소드를 포함하는 테스트라는 클래스 생성 :

class Test 
    def test_method(names={}) 
     names[:firstname] 
     names[:lastname] 
     return names 
    end 
    end 

을 그리고 그것을 호출 같은

test = Test.new 
    myname = test.test_method(firstname: 'Tester', lastname: 'Testing') 

    puts myname 

물론, 내가 가진 결과는

그래서, 내가 다른 사용 "FIRSTNAME 테스터 LASTNAME 테스트"입니다 방법. I가 10 개를 초과하는 경우 내가 원하는 결과를 얻을 수 있어요

def test_method(names={}) 
     @firstname = names[:firstname] 
     @lastname = names[:lastname] 
     return @firstname, @lastname 
end 

하지만 [: FIRSTNAME] 이름 [: LASTNAME, 다음과 같이 나는 두 개의 인스턴스 변수가 @firstname와 이름 @lastname 설정 논쟁을 설정해야합니까? 결과를 얻는 더 좋은 방법이 있다면?

+0

반대로이 시도' test_method'는 클래스 메소드가 아닙니다. – sawa

+0

아, 네. 감사. 그것은 단지 방법입니다. – user2727616

+0

@ user2727616'puts myname'은'firstname Tester lastname Testing'이 아니라'{firstname => "Tester", : lastname => "Testing"}'을 출력합니다. 원하는 출력은 무엇입니까? 'test_method'는 무엇을 반환해야합니까? 배열, 문자열? – Stefan

답변

0

예. 귀하의 해시 키의 모든 인스턴스 변수 이름에 해당하는 경우, 당신은 단순히 당신의 키 - 값 쌍을 반복하고 instance_variable_set를 사용할 수 있습니다

def test_method(names = {}) 
    names.each do |key, value| 
    instance_variable_set("@#{key}", value) 
    end 
end 
+0

감사합니다. "instance_variable_set"을 사용하려고했습니다. 더 유연합니다. – user2727616

+0

이 방법은 디버깅의 악몽이 될 수 있습니다. – Stefan

1

당신이 쓴 것과

def test_method(names = {}) 
    names.values # no need to write even return, in ruby last statement of method, is automatically returnd 
end 
+0

대단히 고마워요. 또한 Ruby doc : hash 부분을 읽었지만 test_method에서 심볼을 지정할 필요가 없다는 것을 몰랐습니다. names.keys 또는 names.values를 사용하면 키 또는 값을 반환합니다. – user2727616

관련 문제