長い付録へ突入します。まずは 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 の非互換な(バックポートの難しい)機能
- ハッシュの疑似キーワード
- 複数の splat 演算子のある引数
- meth(*a, b, *c) みたいな引数の渡し方のこと
- ブロックローカル変数が外のローカル変数を遮蔽する
- ブロックがブロック引数を受け付ける。
- -> 構文による lambda 定義
- 正規表現エンジン鬼車。名前つきグループ、読み戻り、否定読み戻りなど
- M17N
- その他よくひっかかるところ
- Enumerator - 使う時は 1.8 にバックポートするコードを書く
- String イテレータ。String は Enumerable を include しなくなった。これも新規に書く時は 1.9 向けに書いてバックポートするほうがいい
- String#[] が返すものが Fixnum から String へ
- エンコーディング変換は Iconv から String#encode へ
付録 A は終了です。こうして書き出すとかなりたくさんあるように思えますが、経験的には古いコードを移植するのはそんなに難しくないと思います。新しく書くものが両方をサポートするようにするのは多少面倒だと思いますが…。
明日からは付録 B の標準ライブラリ紹介のところです。飛ばしていきます。