[解決済み] Rubyの記号の捉え方
質問
を読んでいるにもかかわらず、" 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つのハッシュオブジェクトです。
関連
-
[解決済み】Ruby: 特定のバージョンのruby gemをインストールする方法は?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Rubyで文字列を小文字・大文字に変換する方法
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Rubyのclass << selfイディオム
-
[解決済み] RubyでDateTimeの時間部分を設定する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン