2017-04-07 7 views
0

私はRubyのシンボルの程度を理解しようとしています。文字列とは対照的に、シンボルをキーとして使用する方がはるかに高速で効率的ですが、どのように高速ですか?メソッドをシンボルとして作成するのはなぜ重要ですか?

私が理解しているように、メソッドを参照するときには、to_iではなく、:to_iのシンボルとして表現する必要があります。これの目的は何ですか? Rubyで

+0

'メソッドを参照するときはシンボルとして表現する必要があります。 (すなわち、to_iとは対照的にto_i)これは何の目的ですか? - array.map(&:to_i)のような意味ですか? – idej

+0

ようこそスタックオーバーフローへ。シンボルが何で、どのように動作するか知りたいのですか、またはメソッド名を渡すときにシンボルを使用する理由を知りたいのですか?質問は関連しておらず、幅広い質問につながります。 「[ask]」とリンク先のページをお読みください。 –

+1

それはシンボルに関する他の質問と重複しています。ただ検索を使用しようとする – idej

答えて

8

、シンボルは単に不変の文字列です:不変なので

"hello " + "world" #=> "hello world" 
:hello_ + :world #=> NoMethodError: undefined method `+' for :hello:Symbol 

は、たとえば、シンボル、安全で信頼性の参照を行います

Object.methods => [:new, :allocate, :superclass, #etc..] 

Rubyはここに文字列を使用した場合、ユーザーは文字列を変更することができ、Object.methodsの将来の呼び出しを破壊することになります。これは、メソッドが呼び出されるたびに文字列のコピーを作成することで修正できますが、それは膨大なメモリフットプリントになります。 Rubyはシンボルが変更されようとしてされることはありません知っているので、それは関係なく、あなたがそれを宣言何回、一度だけ、各シンボルを保存していない事実

、:

"hello".object_id #=> 9504940 
"hello".object_id #=> 9565300 

:hello.object_id #=> 1167708 
:hello.object_id #=> 1167708 

これは、シンボルの省メモリ性を取ります小さなメモリオーバーヘッドでどこでもどこでもコード内のシンボルリテラルを使用できるようになります。

あなたの質問に対する答えは、シンボルを変更することはできませんが、より安全でメモリ効率に優れています。したがって、変更する必要がないことがわかっている文字列があるときはいつでもそれらを使用する必要があります。それはハッシュでいながら、あなたは、ハッシュのキーを変更することはありません

  1. シンボルがあるためハッシュするキーとして使用されています。

  2. ハッシュは多くのリテラル参照を必要とします。すなわち、my_hash[:test]です。そのため、記号を使用するとメモリー効率が向上します。

メソッド参照:メソッドを直接渡すことはできません。つまり、メソッドを渡して実行することの違いを知ることができないため、send(my_method())は参照できません。ここでは文字列を使用することができましたが、定義されたメソッドの名前は決して変更されないので、名前をシンボルとして表すのがより理にかなっています。

関連する問題