2013-12-20 2 views
7

C 확장의 Ruby 2.0.0 키워드 인수를 어떻게 처리합니까? 다른 호출 시퀀스 또는 옵션을 많이 가지고 방법을 처리 할 때 (위 같은)C 확장의 Ruby 키워드 인수

배경

def example(name: 'Bob' hat_color: 'red') 
    puts "#{name} has a #{hat_color} hat!" 
end 

example         #=> "Bob has a red hat!" 
example(name: 'Joe', hat_color: 'blue') #=> "Joe has a blue hat!" 

키워드 인수는 매우 유용합니다. C 확장 (내 프로젝트에서 OpenGL 드로잉의 대부분을 처리하는 blit 메서드)에 이러한 메서드가 하나 있는데이 메서드를 사용하여 루비에서 키워드 인수를 처리하는 방법이 궁금합니다.

아이디어 내가했던 몇 가지 조사를 바탕으로

, 나는 그런 처리가 rb_scan_args C 기능에 : 옵션을 통해 수행 될 수 있다고 생각합니다. 그러나, 그것을 사용하는 방법에 대한 정보를 찾을 수 없었습니다.

답변

5

현재 키워드 인수를 직접 사용하는 핵심 방법이 없습니다. 즉, klass.instance_method(:method).parameters은 기본 클래스의 경우 :key을 반환하지 않습니다.

아마도 인수를 받아들이는 메소드 (이 경우에는 해시)를 정의하고 직접 구문 분석해야합니다. 그렇게하려면 rb_scan_args: 인수와 함께 사용하여 마지막 인수 (예 : dir_initialize)에서 Hash 또는 OPTHASH_GIVEN_P 매크로 (array.c)와 비슷한 코드를 가져올 수 있습니다. 해시에서 rb_get_kwargs을 사용하여 원하는 값을 얻을 수 있습니다. 원하는 경우 알 수없는 키워드 인수에 대해 오류를 생성하는 방법을 조사하지 않았습니다. 나는 대부분의 핵심 방법이 (적어도 아직은)이 수표를하지 않는 것 같아요.

키워드 요소를 사용하여 Ruby에서 메서드를 정의하고 거기에서 내부 C 메서드를 호출 할 수 있습니다. 이렇게하면 무료로 알려지지 않은 키를 확인하고 적절한 parameters 서명을 얻을 수 있습니다.

나는 (this issue 참조)이 더 자연 무엇보다도 C 함수의 키워드 인수를 가지고 만들 것 루비 2.2 방법을 정의하는 개정 된 API를 사용하여 이러한 상황을 개선하기 위해 희망

+0

좋아, 감사합니다! C의 확장 API로 키워드의 인수를 처리 할 수없는 경우,'rb_scan_args'의':'옵션은 무엇을합니까? – tophat

+0

@tophat : 답변 됨, HTH. –