記号と文字列は2つの異なる目的を果たします。
文字列は古き良きおなじみの友達です。変更可能でゴミ収集可能です。文字列リテラルまたはメソッドを使用するたび#to_s
に、新しい文字列が作成されます。文字列を使用してHTMLマークアップを作成し、テキストを画面に出力します。
一方、記号は異なります。各シンボルは1つのインスタンスにのみ存在し、常に存在します(つまり、ガベージコレクションされません)。そのため、新しい記号を非常に注意深く(String#to_sym
そして:''
文字通りに)作成する必要があります。これらのプロパティは、名前を付けるのに適した候補になります。たとえば、のようなマクロで記号を使用するのは慣用句attr_reader :foo
です。
外部ソースからハッシュを取得し(たとえば、JSON応答を逆シリアル化した場合)、シンボルを使用してその要素にアクセスする場合は、HashWithIndifferentAccessを使用するか(他の人が指摘しているように)、ActiveSupportからヘルパーメソッドを呼び出すことができます。
require 'active_support/core_ext'
h = {"body"=>{"results"=>[]}}
h.symbolize_keys # => {:body=>{"results"=>[]}}
h.stringify_keys # => {"body"=>{"results"=>[]}}
トップレベルにのみ触れ、子ハッシュには入らないことに注意してください。