8

C拡張からRuby 2.0.0のキーワード引数をどのように処理しますか?

バックグラウンド

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 エクステンション (blit私のプロジェクトでほとんどの OpenGL 描画を処理するメソッド) にそのようなメソッドを 1 つ持っており、そのメソッドで ruby​​ からのキーワード引数をどのように処理するのか疑問に思っています。

アイデア

私が行ったいくつかの調査に基づいて、 C関数の:オプションを介してそのような処理が行われる可能性があると思います。rb_scan_argsただし、それを使用する方法に関する情報は見つかりませんでした。

4

1 に答える 1

6

現在、キーワード引数を直接使用するコア メソッドはありません。つまり、組み込みクラスに対してklass.instance_method(:method).parameters返されることはありません。:key

おそらく、引数 (この場合はハッシュ) を受け取るメソッドを定義して、それを自分で解析する必要があります。これを行うには、引数を使用rb_scan_argsして、最後の引数から:を取得するか (例: )、またはマクロに似たコード(を参照) を使用できます。ハッシュから、必要な値を取得するために使用できます。必要に応じて、認識されないキーワード引数に対してエラーを生成する方法については調べていません。ほとんどのコア メソッドはこのチェックを (少なくともまだ) 行っていないと思います。Hashdir_initializeOPTHASH_GIVEN_Parray.crb_get_kwargs

キーワード要素を使用して Ruby でメソッドを定義し、そこから内部 C メソッドを呼び出すことができます。これにより、不明なキーがチェックされ、適切なparameters署名が無料で提供されます。

Ruby 2.2 でメソッドを定義する API を改訂して、この状況を改善したいと考えています。これにより、特に C 関数でキーワード引数を使用することがより自然になります (この問題を参照してください) 。

于 2013-12-20T20:36:58.257 に答える