Ruby Symbolの詳細


Rubyを使用して開発した際、その中で大量に使用されていた:paramという声明方式の変数がよく理解できず、やっと説明が分かりやすい文章を見つけて、転載してバックアップを残した.
の原因となる
最近ruby on railsを勉強しているのは、確かに優れたデータベース開発フレームワークです.しかし、プロセス中、ビューフォルダのrhtmlファイルには、次のような文がたくさんあることがわかりました.
<td><%= link_to recipe.title, :action => "show", :id => 1 %></td>

これはリンクを指すもので、コロンがなければ意味がよく理解できます.これは指向です.
http://127.0.0.1:3000/recipe/show/1の接続、すなわち「表示」データベーステーブルrecipeの「id」が1のエントリの情報ですが、actionとidの前のコロンが何に使われているのか分かりません.
rubyのオブジェクト向け特性の欠点
rubyでは、すべてが対象です.簡単な文字列の例を示します.

ruby -e 'puts "hello world".class'
String

ここでは、「hello world」の文字列が属するクラスを印刷し、Stringオブジェクトのインスタンスであることを示します.オブジェクト番号も表示できます.

ruby -e 'puts "hello world".object_id'
41436168

rubyが自分が完全に対象に向いていると標榜してきた理由は、確かに徹底しているからだ.しかし、何事も良いものは悪いもので、1つのオブジェクトが占有するメモリ空間は明らかに純粋な変数よりずっと大きく、プログラムに大量の文字列が含まれている場合、1つのrubyプログラムは多くのメモリを消費しすぎます.例を挙げると、
私たちはhashリストで歌の情報を保存します.

song1 = { 'title' => 'used to love you', 'artist' => 'john legend'}
song2 = { 'title' => 'i still', 'artist' => 'backstreet boys'}
#......
#   ,      
for i in 1..2
 thesong="song"+i.to_s
 eval <<-PROC
 #{thesong}.each_key { |key| puts key.object_id.to_s }
 PROC
end

結果:
41436144
41436408
41435904
41436000
なぜならobject_idはそれぞれ異なり、hashテーブルの各keyは独立したStringオブジェクトであり、コンテンツが同じであってもrubyはそれを異なるオブジェクトと見なし、メモリを無駄に消費している.しかし、実際には、hashのkeyをフィールドと見なしているだけで、Stringクラスの方法には触れず、rubyは自動的にそれを対象に鶏を殺す牛刀の疑いがあるように設定します.
Symbolって何?
直訳すると「記号」であり、rubyではactionのような形をしており、1つのコロンの後に文字列が付いている.明らかに、「すべてが対象」の法則に基づいて、それも対象です.

ruby -e ' puts :action.class '
Symbol

このオブジェクトは、「同じコンテンツ文字列、異なるオブジェクト」がメモリを過剰に消費する問題を解決することを意味します.簡単に言えば、actionは「action」文字列を表し、ここでは文字列であり、文字列オブジェクトではありません.

ruby -e ' puts :action '
action

より正確にはsymbolオブジェクトがそのオブジェクトのコロンを表す文字列です.

ruby -e ' puts :action '
action
ruby -e ' puts :"hello world" ' 
hello world

同じコンテンツのすべての文字列を1つのタグオブジェクトで置き換えることで、不要なオブジェクトの作成とメモリの消費量を削減できます.ただし、「symbolは文字列を表し、オブジェクトではない」と強調したように、Stringクラスのcapitalize、centerなどのメソッドを使用できるようにマークするのは望ましくありません.使用すると、プロンプトメソッドが定義されていないエラーレポートしか得られません.

ruby -e ' puts :action.capitalize ' 
-e:1: undefined method 'capitalize' for :action:Symbol' (NoMethodError)

幸いなことにsymbolは変換関数to_を提供していますsは、文字列の内容を抽出し、オブジェクトにアップグレードする文字列オブジェクトを生成するために使用されます.

ruby -e ' puts :action.to_s.capitalize ' 
Action

また、symbolには付与方法がなく、言い換えればsymbolが定義されると変更できないことが重要です.

ruby -e ' :action="hello" ' 
syntax error

残念ながらto_を使ってもs,rubyは「to_s=」が未定義関数であると考えられるため,付与は依然としてうまくいかない.変換によって生成された文字列オブジェクトに参照を明示的に指定しない限り(実際には、コピー後に接続の指向が変化します):

:action
myaction=:action.to_s
myaction="lala"
puts myaction

結果:
lala
symbolをどのように使用するかsymbolを使用できる場所でも、その方向に対応する文字列オブジェクトを使用できます.railsにはjavabeanのような方法があります.

attr_reader :action

インスタンス変数@actionを読み込む方法を確立し、次のように書くこともできます.

attr_reader "action"

逆に、文字列がプログラムの実行中に変更されず、文字列がStringクラスメソッドを使用する必要がない限り、文字列オブジェクトの代わりにsymbolを使用することで、railsでは特にメモリの消費量を大幅に削減することができます.各制御方法とページ間で頻繁にデータをジャンプしたり転送したりする必要があるため、大量のメソッド名をsymbolに置き換えたり、メモリを節約したりして実行速度を向上させることができます.