Ruby 1.9の非互換

投稿者 akira 2007-06-12 15:00:00 GMT

Ruby 1.9での新機能や変更はChanges in Ruby 1.9に詳しくまとめられているのだが、最近の更新がないようで少し古くなってきているみたい。ChangeLogを追っかけて続きを作…… るというのは難しいので、テスト内容の違い、RDocエントリの違い、おぼろげな記憶などをたりよりに少しだけ探ってみた。あー、非互換のところだけ。

文法上ダメになったこと
  • ifelsifunlesswhenの条件に続けて:を書き、それ続けて実行文を書いてしまう
  • ブロックパラメータにインスタンス変数を指定する
  • ブロックパラメータに同じ変数を何度も指定する
挙動が変わったこと
  • 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では[]
  • ブロックパラメータでも似たような状況がある(もう少し複雑な条件?)
  • クラス変数への値の設定の際、上位クラスを見なくなった(このあたり)
  • attrattr_readerのaliasになる(予定? 今は第二引原がtruefalseの場合に特別扱いしてくれているが、そのうちダメになる?)
  • ブロックパラメータがブロック内でローカルになった(外側の変数と重なっても例外にはならない)
  • ブロックローカル変数ができた(外側の変数と重なっても例外にはならないが、そのうち例外が上がるようになるのかな?)
    foo {|a; b, c| } # bとcがそれ
  • Array#[n,m]へのnilの代入でnilが代入されるようになった
  • ?cが文字列を返す
  • printputsがnilを「nil」と出力せず空文字列を出力するようになった

とりあえずこのくらいは分かった。見落としがあるかも(ありそう)。それとも意外と少ない? (Threadまわりとか動作上の変化はないのかな?)

そうそう、Changes in Ruby 1.9にあるfoo[]{|x|}というのは一時期たしかにできてたみたいなんだけど、それはたまたまそうなっただけらしく、今(r12207あたりから)は再びできなくなっている。

トラックバック

トラックバックリンク:
http://arika.org/diary/trackbacks?article_id=2193