まりぴよこのブログ

日々の日記。技術ネタでまとまりきってないものの記録、伝わる文章の書き方を練習とか。

Ruby Koans で学ぶ Symbol 続き・・

動的にシンボルを生成出来る

String -> Symbol

string = "catsAndDogs"
assert_equal :catsAndDogs, string.to_sym

昨日シンボルの深みで溺れてたついでに見つけた記事

(翻訳) Ruby 2.2 のシンボル GC | FIVETEESIXONE

シンボルのガベコレをどうするかっていう話。 ちょっと今の私には難しくて、ちゃんと理解してる訳じゃないけど、2.2からはSymbol DOSを避けられる(GCが回収してくれる)ようになった。という話。

プログラマって、色んな層で色んな問題を解決してるんだぁ、と改めて思った。 言語設計なんて、雲の上の人ってイメージあるけど、そういう人がどんなアプローチでどんな問題を解決しようと考えたのか。 Rubyってそういう情報がオープンに公開されてて、しかも途中に何人もそれを噛み砕き、広めようって自主的に思う人が沢山いるのが、良い文化だな〜と思います。 どっぷり浸かって一日中Ruby書いてみたいよ。。

SymbolとStringは違う

  • 型を調べてシンボルが文字列ではないことをチェック
  • シンボルと文字列リテラルを比較して、違うことをチェック
symbol = :ruby
assert_equal false, symbol.is_a?(String)
assert_equal false, symbol.eql?("ruby")
  • シンボルがStringのメソッドを持っていないことをチェック
assert_equal false, symbol.respond_to?(:each_char)
assert_equal false, symbol.respond_to?(:reverse)
  • シンボルには文字列用の+オペレータが使えないことをチェック
assert_raise(NoMethodError) do
  :cats + :dogs
end

Koansからの課題

原文:

Why is it not a good idea to dynamically create a lot of symbols?

意訳:

何故大量のシンボルを動的に作りだすのは良い考えではないか?

深みに溺れたついでに見つけたページのことだ!

2.2からは大丈夫になるけど、それ以前のRuby versionの場合、シンボルがガベコレで回収されないから、 Symbol DOS攻撃にやられてメモリ無くなっちゃうから。だよね?

よし。やっとシンボルの章クリア〜♪