ruby 1.9.3 における Hash#to_json および Array#to_json のAPI仕様変更について
もしかして今も世界のどこかでハマっている誰かのためにメモ。
Ruby 1.9.3 に添付されている json モジュールはAPI仕様が変更されており 1.9.2 までで使えていた2引数呼び出しが使えなくなっている(エラーになる)。
まず 1.9.2。
1.9.2p290 :001 > require 'json' => true 1.9.2p290 :002 > {:a => 1}.to_json(nil, 0) => "{\"a\":1}" 1.9.2p290 :003 >
普通に使える。で 1.9.3 では。
1.9.3-p125 :001 > require 'json' => true 1.9.3-p125 :002 > {:a => 1}.to_json(nil, 0) ArgumentError: wrong number of arguments (2 for 0..1) from (irb):2:in `to_json' from (irb):2 from /Users/tagomoris/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>' 1.9.3-p125 :003 >
コードを見た限り 1.9.2-p381 では2引数、1.9.3-p0 では1引数という状況だったので、patch levelでの差は無いと思う(previewとかは知らん)。
元々第2引数 depth はHashの中にHashがあるようなケースで再帰的にシリアライズしていくとき、あまりに深いオブジェクト構造は途中でシリアライズを諦める、というような制御を行うために使われていた、というか、使っていた。このためArrayやHashにしかこの引数はなかった。んだけど、なくなってしまった。なんでだ……。
元々のモジュール作者のマニュアルでは1引数の記述になっているので、意図的なものらしい。無限再帰的なオブジェクト作ったらどうするんだろうな。
るりまでは1.9.3のものでも2引数の記述のままになっていたので、とりあえずチケットをきっておいた。
さくっとpullreqできればするんだけど、できないのかな。ふべん。