2011-11-12 5 views
4

、あなたがruby​​ではCONST_ID()の目的は何ですか?また、rb_intern()の利点は何ですか?ルビーのC拡張で

rb_funcall(object, rb_intern("method name"), argumentcount, arg1, arg2, …); 

rb_internを(行うことができますメソッドをコールする)は、メソッド名のいくつかの内部represantationを返します。 私の代わりに

ID method; 
CONST_ID(method, "method name"); 
rb_funcall(object, method, argumentcount, arg1, arg2, …); 

正確rb_intern()とCONST_ID beetwen違いは何をいくつかのコードを見てきました。 CONST_ID()にはどのような利点がありますか?

答えて

4

CONST_IDマクロはrb_intern2(これはrb_internとほぼ同じです)を呼び出してIDを取得しますが、大きな違いが1つあります。 include/ruby/ruby.hCONST_IDマクロソースを見ると、新しいブロックが開始され、結果をキャッシュするための静的なID変数が定義されていることがわかります。そのブロックが次に実行されるときに、静的変数がすでに設定されている場合は、IDをもう一度検索する代わりに、キャッシュされた結果を返します。

同じことをしますが、CONST_IDは、同じ文字列を複数回検索する方が高速です。

関連する問題