アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Rubyでなにもしない

こんにちは、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

と書くことにしました。
これはこれで妥当ですね。 ■