Ruby 1.9の非互換
Ruby 1.9での新機能や変更はChanges in Ruby 1.9に詳しくまとめられているのだが、最近の更新がないようで少し古くなってきているみたい。ChangeLogを追っかけて続きを作…… るというのは難しいので、テスト内容の違い、RDocエントリの違い、おぼろげな記憶などをたりよりに少しだけ探ってみた。あー、非互換のところだけ。
- 文法上ダメになったこと
if、elsif、unless、whenの条件に続けて:を書き、それ続けて実行文を書いてしまう- ブロックパラメータにインスタンス変数を指定する
- ブロックパラメータに同じ変数を何度も指定する
- 挙動が変わったこと
Object#{id,type}なんかがなくなったKernel#{chomp,chop,sub,gsub}{,!}やKernel#{scan,split}などがなくなったException#to_strがなくなったThread.{critical,critical=}がサポート外になり、Thread.exclusiveがなくなった(YARVの制限?)evalによるローカル変数の定義ができない(YARVの制限?)eval("foo = 1"); eval("foo") #=> NameError- 多重代入が整理された結果、一部の挙動が変わった
x = 1; a = *x; a #=> 1.8では1、1.9では[1] x = []; a = *x; a #=> 1.8ではnil、1.9では[] x = [[]]; a = *x; a #=> 1.8では[]、1.9では[[]] x = []; *a = x; a #=> 1.8では[[]]、1.9では[]
- ブロックパラメータでも似たような状況がある(もう少し複雑な条件?)
- クラス変数への値の設定の際、上位クラスを見なくなった(このあたり)
attrがattr_readerのaliasになる(予定? 今は第二引原がtrueかfalseの場合に特別扱いしてくれているが、そのうちダメになる?)- ブロックパラメータがブロック内でローカルになった(外側の変数と重なっても例外にはならない)
- ブロックローカル変数ができた(外側の変数と重なっても例外にはならないが、そのうち例外が上がるようになるのかな?)
foo {|a; b, c| } # bとcがそれ Array#[n,m]へのnilの代入でnilが代入されるようになった?cが文字列を返すprintやputsがnilを「nil」と出力せず空文字列を出力するようになった
とりあえずこのくらいは分かった。見落としがあるかも(ありそう)。それとも意外と少ない? (Threadまわりとか動作上の変化はないのかな?)
そうそう、Changes in Ruby 1.9にあるfoo[]{|x|}というのは一時期たしかにできてたみたいなんだけど、それはたまたまそうなっただけらしく、今(r12207あたりから)は再びできなくなっている。
トラックバック
トラックバックリンク:
http://arika.org/diary/trackbacks?article_id=2193


