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攻撃にやられてメモリ無くなっちゃうから。だよね?
よし。やっとシンボルの章クリア〜♪