2016-12-22 13 views
0

나는 이런 식으로 작동하는 API를 설계하려고 : 그래서키워드 인수와 해시를 결합한 루비 메소드를 작성하려면 어떻게해야합니까?

client.entries(content_type: 'shirts', { some: 'query', other: 'more', limit: 5 }) 

client 클래스에서이 방법이 있습니다

def entries(content_type:, query={}) 
    puts query 
end 

을하지만 나는 또한 스플래 팅을 시도 syntax error, unexpected tIDENTIFIER

를 얻을 수 :

def entries(content_type:, **query) 
    puts query 
end 

하지만 얻을 수

syntax error, unexpected ')', expecting =>...ry', other: 'more', limit: 5 }) 

인수의 순서를 바꾸지 않고 올바른 방법을 사용하면됩니다. 두 번째 인수는 해시로 가지고 있는데 현재 MRI와 JRuby에서의 두 번째 매개 변수로

답변

1

두 번째 작품을 keyword argument를 사용하지 않으 :

def entries(content_type:, **query) 
    puts query 
end 
entries(content_type: 3, baz: 4) 
# => {:baz=>4} 

첫 번째가 있기 때문에 작동하지 않을 수 있습니다 키워드 인수를 가질 수없고 또한 키 - 값 쌍을 해시 인수로 자동 수집 할 수도 없습니다. 응답

편집이 언급 :

당신이 해시를 통과하고 해시에 추가 키워드를 수집하지 싶었다면, 당신은 서명 반대해야합니다

def entries(query={}, content_type:) 
    puts query 
end 
entries(content_type: 3) 
# => {} 
entries({ baz: 4 }, content_type: 3) 
# => {:baz=>4} 

를 또는, 플랫 수 당신의 해시 :

:

def entries(content_type:, **query) 
    puts query 
end 
entries(content_type: 3, **{baz: 4}) 
# => {:baz=>4} 

또는, 당신은 키워드로 또한 두 번째 인수를 만들 수 있습니다

def entries(content_type:, query: {}) 
    puts query 
end 
entries(content_type: 3) 
# => {} 
entries(content_type: 3, query: {baz: 4}) 
# => {:baz=>4} 
+0

네가 충분히 가깝지만 원하는 API와 정확히 일치하지 않습니다. 사용자가 명시 적 해시를 전달하려고합니다. –

+0

아니요 - 그렇게 할 수 없습니다. 첫 번째 인수가 없으면 두 번째 것은 의미가 없습니다. –

+0

메서드 호출에서 해시를 표시합니다. 와우는이를 알지 못했습니다! 그러나 이것은 api 사용자에게 물어 보는 것이 너무 어렵습니다. 나는 내가 –