読者です 読者をやめる 読者になる 読者になる

すがブロ

sugamasaoのhatenablogだよ

Ruby1.8と1.9に対応するスクリプトを書くには

ruby

基本的にはどちらでも動くんだけど(自分の作ったライブラリの場合は)

文字コード周りは、1.9 からは NKF とか使わず、Encoding クラスを使うように方向転換したいと考えている*1

どうやって場合分けをしよう

まず、Ruby のバージョンで判断を行う、というのは Disられそうなので却下。
というわけで、テキトーにメソッドをコールして NoMethodError が出たら〜とか考えていたのですが、id:willnet さんの発言Twitter / netwillnet: @sugamasao method_missingが一番なの ... で、あぁ、respond_to? を使えばいいんじゃん、という結論に至った*2

こんな感じにする

#!ruby
# vim:fileencoding=utf-8

$USE_ENCODING = true if ''.respond_to? :encoding

puts $USE_ENCODING

$USE_ENCODING は、1.8 なら nil だし、1.9なら(encodingがあるなら) true になるようになる。
毎回 encoding メソッドを使う局面で respond_to? を使うのは効率悪そう*3なので、共通メソッドなり initialize なりで一発呼んで、以降はグローバル変数を見るようにしようかと思う。
Rubyグローバル変数なんて滅多に使わないのだけどこいつはまぁ、例外ということで*4

というわけで

個人的にはそれなりにすっきり書けるようになるのでは、と思っているのですが、Ruby の識者方から見てこれはスジの悪い書き方なんでしょうか。不安で胸が押しつぶされそうです><*5

追記(コメントより)

id:mizincogrammerさん
仰る通りですね、そちらのコードの方がスッキリして良いです><

id:nurseさん
おぉ、なるほど。では上記の方法で良さげなんですね。ありがとうございます!

*1:そっちの方が実装も簡単だし、そうなるべくして、Encoding とかの追加になってると思うので

*2:ありがとうございます!

*3:勝手なイメージで、無視できるレベルなのかもしれませんが

*4:さすがに、ライブラリ内で使うならグローバル変数は避けまますけど

*5:これで良いならスターをくださいw