2009/04/15

Ruby のシンボル

String#to_sym ちょっとはまったこと。

Stringクラスの文字列を to_sym してシンボル化しそれをハッシュのキーで利用している時、なにかの間違いで文字列に半角スペースが混入されてしまうとシンボルの中身は :"word " のように文字列がダブルクォートで囲まれたシンボルになる。このままハッシュのキーに登録してしまうと、 h[:word] で問い合わせても nil が返ってきてしまう。こう書くと当たり前のことなんだろうけども、しばらくの間なんで nil になっちゃうのか悩んでしまった。

スペースが混入する文字列をシンボルにすると...


# coding: utf-8
str = "word"
p str.to_sym
# 半角スペース含む文字
str = " word"
p str.to_sym
#=>
#:word
#:" word"

# :word のようにダブルクォートのないシンボルを得るには
# 半角スペース含む文字
str = " word"
p str.downcase.gsub(\s,'').to_sym
#=>
#:word

ダウンケース、ジーサブ、トゥーシム。とおもったけれども...


str = "%word"
p str.downcase.gsub(\s,'').to_sym
=>
:"%word"

記号が混入されている時もだめなのね。んじゃいっそ ダブルクォート含むシンボルがハッシュキーとして登録されてしまったとして、それを前提としてハッシュの取り出し方をかえればいいのか?


h = {:word=>"aaa", :"%word"=>"bbb"}
p h.each{|x| x.find("word")}
p h.select{|x| "word"}
#=>
#{:word=>"aaa", :"%word"=>"bbb"}
#{:word=>"aaa", :"%word"=>"bbb"}

でも、この後めんどうなことに。やっぱりふりだしに戻って


# :word のようにダブルクォートのないシンボルを得るには
# 半角スペースや記号含む文字列
str = " *%$#wor d"
p str.downcase.gsub(\s|[^\w],'').to_sym
#=>
#:word

これでダブルクォートなしのシンボルになるかな。数字があった場合どうしようかな。
--
#2009-05-12.文字化けとタイプミス修正

0 件のコメント: