2016-08-22 3 views
1

レールにシンボルを使用することを理解できません。私はほとんどの場合、シンボルは単に何か(または文字列)の名前であることを理解しています。たとえば、:name => "John Doe", :email => "[email protected]"です。ただし、次の例では、シンボル:postはプログラムのどこにも定義されていませんが、まだ使用されています。 <%= form_for :post, url: posts_path do |f| %>:postシンボルは何と関連していますか?レールで作業するとき、どのように記号を見ますか?レールにシンボルを使用することを理解できない

+2

':post'は何も関連付けられていません。 '123'のように単なるリテラルです(https://ruby-doc.org/core-2.1.1/doc/syntax/literals_rdoc.html)。 (これはRails固有のものではないRubyの質問ですので、Railsタグを削除する必要があります) –

+0

[Symbol](https://ruby-doc.org/core-2.1.1/Symbol.html)も参照してください。 –

+0

私はCarySwovelandのコメントとmeagarとtadmanの回答の組み合わせが、この質問に対する完全で受け入れやすい回答になると思います。 –

答えて

4

シンボルは「物の名前」ではなく、それ以外のものには関連付けられていません。シンボルはそれだけです:シンボル。固有の識別子を持つが内部でに関連付けられていますが、これは実装の詳細です。

この場合、シンボル:postは、それが呼び出し元スコープにpostという変数を探して、フォームのフィールドを埋めるためにそれを使用する必要がありますform_for機能と通信する以外に何の役割を持っていません。シンボルのシンボリック表現は、メソッドがその変数の位置を特定し、そのフィールドの名前を付けるのに役立ちますが、シンボル:postはコードの他の場所で定義されたものとは関連付けられていません。あなたが:postシンボルを定義したコード内:postを使用することにより

+0

返事ありがとう!私は、特定のシンボルがどのように変数を見つけるかを「知っている」ということについて、私が混乱していると思いますか?それはシンボル自体の名前と関係がありますか? say:postは、 "post"というローカル変数を探しますか? –

+0

番号シンボルは、変数とはまったく関係がありません。シンボルはシンボルです。変数を示すために*使用されるかもしれませんが、列挙された値を示すためにも、または米国高速道路を示すためにも使用できます。シンボル ':post'と変数' post'の間には、*関係はありません。なし。 –

2

が、これらは自動的に新しい名前に遭遇したり、文字列がto_symを経由して、手動でシンボルに変換されるたびに作成されます。

シンボルは、文字列の文字列と比較して頻繁に繰り返し使用されると、より効率的です。彼らは「内在化された文字列」、またはいくつかの記述では「インターン」であり、内部的に辞書に効果的に追加されています。

"post"は、コード内の多くの場所に存在する可能性のある文字列です。それぞれの文字列は、メモリが割り当てられた独立した文字列です。それらの1つを別のものと比較するには、文字列の比較を行う必要があります。

一方、:postは常に同じオブジェクトを参照します。これにより、比較が大幅に簡単になり、さらにメモリが1回だけ割り当てられます。

+0

IMHO、Symbolsの '効率'の側面は、新しいRubyist(ヌビスト?)の単なる追加の混乱です。それは "なぜシンボルと文字列か"という良い情報ですが、私の意見では、 "何がシンボルなのか"に対する良い答えではありません。 – Phrogz

+0

その全目的は効率に関係しているので、その問題を横取りするのは難しいです。 – tadman

関連する問題