7

MRIでは、rb_id2str()電話をかけるとすべての作業を行う責任があるようSymbol#to_sです。これが、かなり単純な操作であると私が想定したものにとって非常に不可解な関数であることを発見して驚いた。

この関数が何をしているのかについての詳細な説明を探しています。参考までに、1.9.3のソースへのリンクは次のとおりです。

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

いくつかの具体的な質問:

4つの主要な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ステートメント内のコードの各ブロックが行うことの一般的な概要を取得することは素晴らしいことですが、行ごとの分析である必要はありません。

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

4

1 に答える 1

1

1 つには、Symbol#to_s が新しい文字列を作成すると確信しています。TrueClass、FalseClass、NilClass、Fixnum、Symbol を除いて、ほとんどの ruby​​ クラスは C 構造体です。ただし、これらは C では int です。したがって、Symbol は String とはまったく別の話です (そのため、値を大幅に変更する必要がない限り、Symbol をお勧めします)。 .

Ruby Hacking Guideという本について知っているかどうかはわかりませんが、MRIがCでどのように実装されているかについて多くのことを説明しています。

参考までに、Ruby Hacking Guide は日本語で書かれていて、まだ翻訳されているのはほんの一部で、みんな諦めているようです。http://rhg.rubyforge.org/

于 2012-11-15T11:06:01.910 に答える