1. ホーム
  2. ruby

[解決済み] Rubyの記号の捉え方

2023-05-03 18:51:46

質問

を読んでいるにもかかわらず、" Rubyの記号を理解する "を読んだにもかかわらず、シンボルを使用する際のメモリ内のデータの表現にまだ戸惑っています。 もし、シンボルが、異なるオブジェクトに含まれる2つのシンボルが、同じメモリ位置に存在する場合、どのようにして、その中に 異なる の値を含むのだろうか? 私は、同じメモリ位置に同じ値が含まれていると予想していました。

これはリンク先からの引用です。

文字列とは異なり、同じ名前のシンボルは初期化され、rubyのセッション中に一度だけメモリ上に存在します

同じメモリ位置に含まれる値をどのように区別して管理しているのかがわからない。

この例を考えてみましょう。

patient1 = { :ruby => "red" }
patient2 = { :ruby => "programming" }

patient1.each_key {|key| puts key.object_id.to_s}
3918094
patient2.each_key {|key| puts key.object_id.to_s}
3918094

patient1 そして patient2 が両方ともハッシュであれば、それでいいのです。 :ruby はシンボルである。 もし、次のように出力するとしたら。

patient1.each_key {|key| puts key.to_s}

では、何が出力されるのでしょうか? "red" あるいは "programming" ?

ハッシュはちょっと忘れて、シンボルは ポインタ へのポインタだと考えています。 私が持っている質問は、次のとおりです。

  • シンボルに値を割り当てることはできますか。
  • シンボルは、値を持つ変数へのポインタに過ぎないのでしょうか?
  • シンボルがグローバルである場合、シンボルは常に1つのものを指しているということですか?

どのように解決するのですか?

これを考えてみましょう。

x = :sym
y = :sym
(x.__id__ == y.__id__ ) && ( :sym.__id__ == x.__id__) # => true

x = "string"
y = "string"
(x.__id__ == y.__id__ ) || ( "string".__id__ == x.__id__) # => false

つまり、シンボルオブジェクトをどのように作成しても、その内容が同じであれば、メモリ上の同じオブジェクトを参照することになります。 これは、シンボルが 不変のオブジェクト . 文字列はミュータブルです。


(下のコメントに対して)

元記事では、値がシンボルに格納されているのではなく、ハッシュに格納されているのです。 これを考えてみましょう。

hash1 = { "string" => "value"}
hash2 = { "string" => "value"}

これはメモリ上に6つのオブジェクトを作成します -- 4つの文字列オブジェクトと2つのハッシュオブジェクトです。

hash1 = { :symbol => "value"}
hash2 = { :symbol => "value"}

これはメモリ上に5つのオブジェクトを作成するだけです -- 1つのシンボル、2つの文字列、2つのハッシュオブジェクトです。