ラベル RubyUtility の投稿を表示しています。 すべての投稿を表示
ラベル RubyUtility の投稿を表示しています。 すべての投稿を表示

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.文字化けとタイプミス修正

2009/04/12

from Ruby Forum's RSS

http://www.ruby-forum.com/topic/183806#803619

さよならRuby?ってどういうこと? 投稿者の方は環境問題に興味をうつしたようだ...。

http://en.wikipedia.org/wiki/Permaculture

infoseekの翻訳によると最初のセンテンスは

パーマカルチャーは、自然な生態環境で見つかる関係を模倣する人間の和解と永続的な農業システムを設計するアプローチです。それは、一連の出版物で1970年代の間にオーストラリア人ビルモリソンとデイビッドホルムグレンと彼らの同僚によって最初に開発されました。語パーマカルチャーは、永久の農業(永久の文化と同様に)の旅行かばんです。

と、翻訳されました。よくわからないけど環境に配慮する農業ってことかな。 portmanteau は「旅行かばん」と訳されてしまったけどブランチ(朝食と昼食をかねた食事)のような混成語だったのね。permalink みたいなものかな。

http://ja.wikipedia.org/wiki/かばん語

「Permaculture」or「パーマカルチャー」は日本の wikipedia には登録されていなかった。残念。