2

Mike HR と Stefan が私の質問にObjectSpace.each_object(String)コメントした後、考えられるほぼすべての文字列が含まれていることに気付きました。

strings = ObjectSpace.each_object(String)
strings.include?("some random string") # => true

また

strings = ObjectSpace.each_object(String).to_a
strings.include?("some random string") # => true

stringsその時点で存在していた文字列のみを含める必要があると考えました。ほぼすべての文字列が含まれるのはなぜですか?

それでも、 の長さを数えるとstrings、有限数が返されます。

ObjectSpace.each_object(String).to_a.length # => 15780

これは、Ruby 2.1.2p95 (2014-05-08 リビジョン 45877) [x86_64-linux] インタープリターと irb で確認されています。

これは、Ruby 2.1 で導入された凍結された文字列リテラルの最適化と関係がありますか?

4

2 に答える 2

5

IRBでコードを記述すると、文字列がObjectSpace入力されたとおりに追加されます。

strings = ObjectSpace.each_object(String)
strings.include?("some random string") # => true

strings = ObjectSpace.each_object(String).to_a
strings.include?("some other random string") # => false

ファイル内でrb実行しようとすると、ファイルが解析されるときにテキストが追加されるため、テキストは既にそこにあります。

test.rb

strings = ObjectSpace.each_object(String)
strings.include?("some random string") # => true

strings = ObjectSpace.each_object(String).to_a
strings.include?("some other random string") # => true

strings = ObjectSpace.each_object(String).to_a
strings.include?("some other random string " + "dynamically built") # => false
于 2014-06-05T15:58:21.187 に答える
0

これは、「何らかのランダムな文字列」をのイテレータのinclude?メソッドに渡すために、最初に「何らかのランダムな文字列」という文字列を作成する必要があるためです。ObjectSpaceeach_object

「ランダムな文字列」の存在を尋ねるだけObjectSpaceで、「ランダムな文字列」を作成しているので、オブジェクト空間にはもちろん存在します。私が言っていることがわかりますか?それで、最初の例を説明します。

「ランダムな文字列」を参照する前に文字列オブジェクトの配列を取得する2番目の例では、falseになると思うでしょう。ご指摘のとおりですが、そうではありません。これは、文字列リテラルを使用しており、Ruby が実際に参照する前に文字列を作成してコードを最適化しているためだと思います。私はRubyの内部について詳しく知りませんが、それについて詳しく説明します。

于 2014-06-05T16:13:01.267 に答える