たごもりすメモ

コードとかその他の話とか。

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引数の記述になっているので、意図的なものらしい。無限再帰的なオブジェクト作ったらどうするんだろうな。

http://flori.github.com/json/doc/classes/JSON/Ext/Generator/GeneratorMethods/Hash.html#method-i-to_json

るりまでは1.9.3のものでも2引数の記述のままになっていたので、とりあえずチケットをきっておいた。

Bug #6189: 1.9.3のjsonモジュールによる Hash#to_json と Array#to_json のAPI変更について - るりまプロジェクト - Ruby Issue Tracking System

さくっとpullreqできればするんだけど、できないのかな。ふべん。