2009-02-24 14 views
55

이것은 바보 같은 질문 일 수 있습니다. 그러나 매개 변수의 해시를 허용하는 루비 메서드를 만드는 방법을 알지 못합니다.매개 변수의 해시를 허용하는 루비 메서드를 만듭니다.

login_success :msg => "Success!", :gotourl => user_url 

매개 변수의이 종류를 받아들이는 방법의 프로토 타입은 무엇입니까 : 나는 레일에서이 같은 방법을 사용하고 싶은 말은? 어떻게 읽습니까?

답변

59

paramaters를 해시 구문의 Ruby 함수에 전달하면 Ruby가이를 목표로 간주합니다. 따라서 :

def login_success(hsh = {}) 
    puts hsh[:msg] 
end 
+0

login_success (* params)와 같은 것을 사용할 수 없습니까? – collimarco

+5

a * (일명 splat 연산자)는 메서드가 임의의 수의 args를 받아들이고 params라는 배열에 넣을 것을 의미합니다. 사용 여부는 사용중인 제품에 따라 결정됩니다. 제공 한 예에서 해시가 의미가 있습니다. – Allyn

+6

그 말은 당신이 어떤 수의 주장을 기대한다고 말합니다. 'foo (1, : b, '3')'와 비슷합니다. 또한, "= {}"부분은 필요 없습니다. 이것은 잘 작동합니다 : def login_success (hash). 위의 코드는 기본값을 빈 해시로 설정합니다. –

30

기억해야 할 중요한 것은 당신이 해시 문자를 {생략 곳 해시 매개 변수가 함수의 마지막 매개 변수 인 경우에만,} 구문을 할 수 있다는 것입니다. 그래서 앨린이 한 일을 할 수 있습니다. 또한

def login_success(name, hsh) 
    puts "User #{name} logged in with #{hsh[:some_hash_key]}" 
end 

그리고 당신은

login_success "username", :time => Time.now, :some_hash_key => "some text" 

로 호출 할 수 있습니다하지만 해시 마지막 매개 변수가 아닌 경우에는 {}와 해시 요소를 둘러싸고해야합니다.

5

하나의 인수 만 사용하십시오. 루비는 해시 이름으로 지정된 값을 변환합니다

def login_success arg 
# Your code here 
end 

login_success :msg => 'Success!', :gotourl => user_url 
# => login_success({:msg => 'Success!', :gotourl => user_url}) 

당신이 정말로 대신 기본 루비 오리 타이핑의 해시를 얻을 수 있는지 확인하려면, 당신은 그것을 제어 할 필요가있다. 예를 들어 뭔가 같은 :

def login_success arg 
    raise Exception.new('Argument not a Hash...') unless arg.is_a? Hash 
    # Your code here 
end 
5

키워드 인수의 출현으로 Ruby 2.0에서 당신은 지금,

def login_success(msg:"Default", gotourl:"http://example.com") 
    puts msg 
    redirect_to gotourl 
end 

루비 2.1에서 기본 값을 남길 수 있습니다 할 수

def login_success(msg:, gotourl:) 
    puts msg 
    redirect_to gotourl 
end 

호출 될 때 기본값이없는 매개 변수를 두지 않으면 ArgumentError

+2

Ruby 2.1의 기본값을 생략하여 필요한 매개 변수를 만들 수 있습니다. 'def login_success (msg :, gotourl :)'는'msg'와'gotourl' 매개 변수를 지정하지 않고'login_success'를 호출하려고하면 오류가 발생합니다. – Ajedi32

관련 문제