2012-11-08 12 views
7

MRIでは、Symbol#to_sに電話すると、rb_id2str()がすべての作業を担当するように見えます。私は、これが非常に単純な操作であると仮定したことに対して、これは非常に潜在的な機能であることに気づいたことに驚きました。MRIの内部:rb_id2strの詳細な説明

私はこの機能の詳細な説明を探しています。

http://rxr.whitequark.org/mri/source/parse.y?v=1.9.3-p195#9950

いくつかの具体的な質問:参考のため、ここでは1.9.3でソースへのリンクがある

やっ四大ifブロックは何ですか?

  1. if (id < tLAST_TOKEN)
  2. if (id < INT_MAX && rb_ispunct((int)id))
  3. if (st_lookup(global_symbols.id_str, id, &data))
  4. if (is_attrset_id(id))

if文の内部コードの各ブロックはありませんが、それはdoesnのものの一般的な概要を取得するために素晴らしいことですライン・バイ・ライン分析である必要があります。

最後に、私はto_sのメモリ/ガベージコレクションの影響について興味:たびにガベージコレクションである必要があり、新しい文字列を作成Symbol#to_sを呼び出し、または使用する内部コピー・オン・ライト最適化のようなものがありますん文字列に対して突然変異が起こるまでの記号の内部表現への参照?

+0

'rb_id2str'はそれ以上のことをします。 'Symbol#to_s'は実際には' rb_sym_to_s'と等価です。この関数は 'SYM2ID'を使ってオブジェクトのIDを取得し、' SYM2ID'によって返されたIDを持つ 'rb_id2str'を呼び出し、オブジェクトのIDから文字列を構築します。しかし、私が逃したいくつかのステップがあるかもしれません。私は 'to_s'に関連するメモリ使用については確信していますが、私は新しい文字列を作成しないと思います – omninonsense

答えて

1

Symbol#to_sが新しい文字列を作成することは間違いありません。 ほとんどのルビクラスはTrueClass、FalseClass、NilClass、Fixnum、およびSymbolを除いてC言語の構造体です。したがって、SymbolはStringとはまったく異なるストーリーです(そのため、値を大きく変更する必要がない限りSymbolが推奨されます)。

私はあなたがそれはMRIがFYI C.

でどのように実装されるかについて多くのことを説明する書籍Rubyのハッキングガイド、知っている場合は、Rubyのハッキングガイドが日本語で書かれており、今までまだありますされるかわかりません小さな部分だけが翻訳され、みんながあきらめたように見えます。 http://rhg.rubyforge.org/

関連する問題