Rubyベストプラクティス 付録A 後方互換性のあるコードを書く

長い付録へ突入します。まずは 1.8 と 1.9 に対応する書き方の話題です。

  • 本書では 1.8.6 と 1.9.1 を対象にしているのでちょっと古い(今なら 1.8.7 と 1.9.2)
  • RUBY_VERSION で分岐したくなるけどできるだけ避ける
    • オープンクラスを利用して 1.9 からメソッドを 1.8 にバックポートする(自分で移植する)
      • 配布するコードの場合はコアに手を入れることで他のライブラリ、フレームワークの動作に悪影響がある恐れもあるので、なるたけ厳密な動作するようにする、変更点をドキュメントするなどが必要
    • ruby_18 と ruby_19 というメソッドを定義して両方にブロック渡しでコードを書く。これはちょっとどうかと思う。普通に分岐したほうがまし
    • open の引数の差異を吸収するための File.read_binary というメソッドを用意
      • 今は File.binread があるのでこれをバックポートするだけ
  • 1.9 の非互換な(バックポートの難しい)機能
    • ハッシュの疑似キーワード
      • { key: "value"} みたいな文法です
    • 複数の splat 演算子のある引数
      • meth(*a, b, *c) みたいな引数の渡し方のこと
    • ブロックローカル変数が外のローカル変数を遮蔽する
    • ブロックがブロック引数を受け付ける。
    • -> 構文による lambda 定義
    • 正規表現エンジン鬼車。名前つきグループ、読み戻り、否定読み戻りなど
    • M17N
  • その他よくひっかかるところ
    • Enumerator - 使う時は 1.8 にバックポートするコードを書く
    • String イテレータ。String は Enumerable を include しなくなった。これも新規に書く時は 1.9 向けに書いてバックポートするほうがいい
    • String#[] が返すものが Fixnum から String へ
    • エンコーディング変換は Iconv から String#encode へ

付録 A は終了です。こうして書き出すとかなりたくさんあるように思えますが、経験的には古いコードを移植するのはそんなに難しくないと思います。新しく書くものが両方をサポートするようにするのは多少面倒だと思いますが…。
明日からは付録 B の標準ライブラリ紹介のところです。飛ばしていきます。