StringとSymbolの違い
Rubyのソースコードを見ていて、"note"という普通の文字列と:note のように、コロンから始まる文字列のようなものが混在しているのに気が付きました。
調べてみると、"note"の方が、Stringオブジェクトで、:noteの方がSymbolオブジェクトで、すごい似てる!!らしいです。
じゃあ、何が違うのかというと、Stringは、記述するたびに、新しいメモリを食います。Symbolは、同じ文字だったら、最初の1回だけメモリを食って、あとは同じメモリを使いまわします。
つまり
じゃあ、文字列っていらないのかな?文字列を使うメリットもどこかであるはずですね。どこでしょうか…
[追記 07/08/10]
いやー、このエントリを書いた頃は若かった。今も若いけど。
今、思いつく限りで追記すると、
・String はくっつけられる
・String のダブルクォーテーションは中で変数の値を展開できる
・Symbol はくっつけられない
・Symbol は変数の値を展開できない
例で示した方が分かるっつーの、という訳で、どうぞ。
調べてみると、"note"の方が、Stringオブジェクトで、:noteの方がSymbolオブジェクトで、すごい似てる!!らしいです。
#irb "note".class
=> String
#irb :note.class
=> Symbol
じゃあ、何が違うのかというと、Stringは、記述するたびに、新しいメモリを食います。Symbolは、同じ文字だったら、最初の1回だけメモリを食って、あとは同じメモリを使いまわします。
つまり
print "hello"
print "hello" #これはメモリを食う
print :hello
print :hello #これは、1回目の:helloと同じメモリを共用する
じゃあ、文字列っていらないのかな?文字列を使うメリットもどこかであるはずですね。どこでしょうか…
[追記 07/08/10]
いやー、このエントリを書いた頃は若かった。今も若いけど。
今、思いつく限りで追記すると、
・String はくっつけられる
・String のダブルクォーテーションは中で変数の値を展開できる
・Symbol はくっつけられない
・Symbol は変数の値を展開できない
例で示した方が分かるっつーの、という訳で、どうぞ。
print "abc" + "def"
=> abcdef
print :abc + :def
=> シンタックスエラー 。゚(゚´Д`゚)゚。
print :abc.to_s + :def.to_s
=> abcdef ※String 型に変換したからです。
str1 = "HANAMOGERA"
print "tamorino#{str1}"
=> tamorinoHANAMOGERA
print 'tamorino#{str1}'
=> tamorino#{str1}
print :tamorino#{str1}
=> tamorino ※シャープ#から後ろは、コメントアウト扱いになる
【広告】
COMMENT
ほんとうですね by 自分
初コメントありがとうございます!
しばらくこのエントリを放っておいたのですが、なるほど、String オブジェクトは、ダブルクォーテーションで囲むと中で変数の値を展開できますね。
my_val = 'abc'
p "123#{my_val}456"
だと
123abc456
ですね。ありがとうございました!
しばらくこのエントリを放っておいたのですが、なるほど、String オブジェクトは、ダブルクォーテーションで囲むと中で変数の値を展開できますね。
my_val = 'abc'
p "123#{my_val}456"
だと
123abc456
ですね。ありがとうございました!
yam by -
#irb :note.class
=> System
これって
=>Symbol
でしょうか?
=> System
これって
=>Symbol
でしょうか?
そうですね by 自分
↑ yam の題名でかいてくださった方へ
そ、その通りです。
こんな細部まで見てくださってありがとうございます。
早速修正しておきましたので、今後とも応援よろしくお願いします!
そ、その通りです。
こんな細部まで見てくださってありがとうございます。
早速修正しておきましたので、今後とも応援よろしくお願いします!
文字列の中で変数の値を展開できますよ。