こんにちは、chibaです!
最近、文字列を場合に応じてUTF-8(デフォルト)と、sjisに切り換えて文字を生成したいということがありました。
自分としては、
"こんにちは".send(if sjis? then :tosjis else なにもしない end)
と書きたかったのですが、Rubyでなにもしないメソッドってなんだったかなーと探してもなかなか見付かりません。 Haskellでいうid、LISP系では、identityというのが多いのですが、ruby identityでググったら、
- Ruby 1.9 - Feature #841: Object#self - Ruby Issue Tracking System
という一連のスレッドがみつかりました。
なるほど、提案はされているもののリジェクトされてるんですね。
高階手続きに馴染んでいる人ならば、identityの有用性は体験していると思うのですが、馴染みのない人からは、identityみたいに何もしないでそのまま受け取った値を返すものなんて何に使うの?という意見は割とFAQかなと思います。
この議論中で
class Object def identity() self; end end
というのが例として挙げられていました。これを使えば、
"こんにちは".send(if sjis? then :tosjis else :identity end)
や
"こんにちは".send(sjis? ? :tosjis : :identity)
と書ける訳ですね。
それで結局自分はどうしたかというと、Objectにメソッドを定義するのも気が引けたので
str = "こんにちは" if sjis? then str.tosjis else str end
とか、
str = "こんにちは" sjis? ? str.tosjis : str
と書くことにしました。
これはこれで妥当ですね。
■