Rubyのシンボル 再考

2007/10/12

Rubyのシンボルについて、もう一回書いてみる。

前回は完全に他力本願になってしまったので、もう一回書いておく。

概念的なこと

Rubyのシンボルは、リファレンスには「任意の文字列と一対一に対応するオブジェクト」とある。
コロンを使った :symbol のような記法以外にも、 'symbol'.intern とも書けることから、JavaのString#intern()に近いものだと思われ、「内部で登録されて管理された文字列」みたいな意味合いなのかなと。

文字列とシンボルの違いをみてみると、
irb> "abc" == "abc"
=> true
irb> "abc".equal?("abc")
=> false
irb> :abc == :abc
=> true
irb> :abc.equal?(:abc)
=> true
同じ名前のシンボルは、同じオブジェクトを指しており、「同一」だといえる。
文字列はそうではなく、内容が同じ(同値)でも毎回新しいオブジェクトを生成しており、
「同値であるが同一ではない」といえる。
(Rubyの==とequal?はJavaのStringとは逆な感じ)

こうすると同じオブジェクトを指しているか否かがわかりやすい。
irb> "abc".object_id == "abc".object_id
=> false
irb> :abc.object_id == :abc.object_id
=> true

シンボルが同じオブジェクトを指し続けるということは、生成も最初の1回しかしないということ。
この点でシンボルを使うことは、パフォーマンス向上にも寄与する。

シンボルは内部では整数で管理されている。
これは Symbol#to_i と Fixnum#to_sym で相互に得ることができることからわかる。
irb> :abc.to_i
=> 16329
irb> 16329.to_sym
=> :abc
数値で管理されているから、生成や比較において文字列よりパフォーマンスがよいわけだ。

以下のようにすると、全てのシンボルを調べることができる。
irb> Symbol.all_symbols.each {|s|
irb>   print s, "=", s.to_i, "\\n"
irb> }

使いどころ

じゃあ使いどころはどーなのよ、といったところ。

  • ハッシュのキーに使う

  • irb> hash = {:key => "value"}
    => {:key=>"value"}
    irb> hash[:key]
    => "value"

  • 名前付き引数のように使う

  • VBの:=な感じ。ハッシュの応用編。
    メソッドを使う側もメソッド側も、意味のある名前でアクセスできるのでわかりやすくなる。
    引数の組み合わせが多い場合にも便利。
    def my_method(x)
      puts x[:name]
      puts x[:age]
    end
    my_method({:name => "ruby", :age => 32})

  • アクセサやaliasへの引数として使う

  • class MyClass
      attr_accessor :name
      ・
      ・
    end
    class String
      alias :indexOf :index
    end

  • Cの列挙型のように使う

  • こちらの例のように、元号などを扱う場合(何かの種類を表すことが目的で、その名前に意味がある場合)、シンボルを使って意味づけしてやると、コードがすっきりする。
      case lang
      when :java
        ...
      when :ruby
        ...
      when :vb
        ...
      end

    Javaも5からEnumが追加されたようですね。

Ruby and Rails | コメント(4) | トラックバック(0)
トラックバック
トラックバックURL:
コメント
通りすがり
2009/05/08

わかりやすいです。 とってもすっきりしました。 ありがとうございました。

ryu
2009/05/10

通りすがりさん お役に立てて何よりです。 また寄っていってください。

ut_ymgc
2009/10/13

すごくわかりやすかったです!もやもやしていたものがとれました

ryu
2009/10/15

ut_ymgcさん それはよかったですね。 やっぱり最初はみんなモヤモヤするんですね。 またどうぞ。

コメントをどうぞ
名前 (入力しなければ「通りすがり」):

メールアドレス (入力しても公開されません):

URL (入力すればリンクが張られます):


コメント:

(コメントにタグなどを使ってもタグがそのままが表示されます)