2009-03-18 4 views

答えて

7

ほとんどの場合、リテラルを使用してシンボルとして表示されますが、ここではメモリ爆発の可能性はあまりありません。彼らの行動は、その使用法によってかなり必要とされます:あなたがシンボルを参照するたびに、それは同じものです。

同様に、文字列はRubyでは一意である必要があります。これは、使用されている方法(テキスト処理など)のためです。

セマンティクスによって使用するものを決めます。早めに最適化しないでください。

8

あなたの代わりにそこに文字列を使用する場合は、あなたのループ内で同じシンボルを参照する場合、それは今

while i < 10000 
    i += 1 
    :im_using_this_symbol_here 
end 

すなわち、そのオブジェクトのたびを再作成する必要はありません、文字列は10K回に再作成されます。一般的に、定数やキーのようにリテラルをほとんど扱う場合には、シンボルを使用します。私にとって非常に良い例は

link_to "News", "action" => 'news' 

アクションがアプリケーション内で何度も再使用されて

link_to "News", :action => 'news' 

代わりとなるであろう。

+11

私は経験則を追加することができます。ユーザーが指定した文字列をSymbolsに変換することはありません。それはDOS攻撃の可能性を開くでしょう。 – Arsen7

6

Ruby 2.2.0以降を使用している場合は、more details about the new symbol GCへのリンクを持つRuby 2.2.0-preview1 announcementに従ってガーベジコレクションされるため、多くのシンボルを動的に作成するのが通常はOKです。しかし、ダイナミックシンボルをID(Cソースコードで使用されている内部Ruby実装のコンセプト)に変換するコードに渡すと、その場合は固定され、ガベージコレクションは行われません。私はどのくらい一般的にそれが起こるかわからない。

あなたが考慮すべき記号や文字列を使用するかどうかを決定する:それらが作成された後

  • シンボルを変更することはできません。
  • シンボルには、文字列に含まれるメソッドが多くありません。
  • シンボルは、同等の点で非常に効率的に比較できます。
  • シンボルは、Symbol docsに従って何かの名前を表すものとします。私は名前とはみなせないものを保管するためにそれらを使用しません。
関連する問題