ruby 1.8.2 から ruby 1.8.3 までの変更点です。
掲載方針
以下は各変更点に付けるべきタグです。
記号について(特に重要なものは大文字(主観))
bundled libraryである(rubyの一部ではない)soap4rの変更点については、以下を参考にしてください。 soap4r-1.5.3がruby-1.8.2、soap4r-1.5.5がruby-1.8.3にbundleされています。
追加。
rm_f と rm_rf が :secure オプションを受け付けるようになりました。 cd が :noop オプションを受け付けなくなりました。 cp_r が :dereference_root オプションを受け付けるようになりました。
型チェックを厳密にするようになりました。
$ ruby-1.8.2 -e 'p File.join(1, 2)' "1/2" $ ruby-1.8.3 -e 'p File.join(1, 2)' -e:1:in `join': can't convert Fixnum into String (TypeError) from -e:1
与えられた pathname がピリオドで終る場合、ピリオドではなく空の文字列を返すようになりました。
$ ruby-1.8.2 -e 'p File.extname("a.")' "." $ ruby-1.8.3 -e 'p File.extname("a.")' ""
https での Proxy 認証をサポートするようになりました。
追加。
Net::HTTPHeader#canonical_each は Net::HTTPHeader#each_capitalized に名前が変わりました。canonical_each も each_capitalized の別名とし て提供されます。
WebDAV のメソッドをサポートするようになりました。 PROPPATCH, LOCK, UNLOCK, OPTIONS, PROPFIND, DELETE, MOVE, COPY, MKCOL。
obsolete になりました。VERBOSE モードの時、警告が出ます。
新クラス、追加。OpenSSL::PKCS7::Signer が OpenSSL::PKCS7::SignerInfo に名前が変わりました。Signer も別名として 引続き提供されます。
新クラス、追加。OpenSSL 0.9.8 以降とともにコンパイルされた時のみ。
メソッドが定義された時の $SAFE レベルを記憶するようになりました。 メソッドは定義された時の $SAFE レベルで実行されます。 $SAFE レベル 3 以上の環境下において定義されたメソッドを呼び出すことは、$SAFE レベル が 0 のとき 禁止されるようになりました。
$ cat mthd_taint.rb th = Thread.new{ $SAFE = 3 class Hoge def foo puts "safe level: #{$SAFE}" end end } th.join p $SAFE Hoge.new.foo $ ruby-1.8.2 mthd_taint.rb 0 "safe level: 0" $ ruby-1.8.3 mthd_taint.rb 0 mthd_taint.rb:11:in `foo': calling insecure method: foo (SecurityError) from mthd_taint.rb:11
空文字にも taint が伝播するようになりました。[ruby-dev:26900] [ruby-dev:27121]
$ ruby-1.8.2 -e 'p ("x".taint * 0).tainted?' false $ ruby-1.8.3 -e 'p ("x".taint * 0).tainted?' true $ ruby-1.8.2 -e 'p ("x".taint[1..-1]).tainted?' false $ ruby-1.8.3 -e 'p ("x".taint[1..-1]).tainted?' true
Range オブジェクトが taint されている場合、"string"[range] も taint されるようになりました。[ruby-dev:27121]
$ ruby-1.8.2 -e 'p ("x"[(0..-1).taint]).tainted?' false $ ruby-1.8.3 -e 'p ("x"[(0..-1).taint]).tainted?' true
Time.parse が小数点以下の秒も扱えるようになりました。[ruby-talk:153859]
$ ruby-1.8.2 -r time -e 'p Time.parse("23 Aug 2005 19:00:01.1").to_f' 1124791201.0 $ ruby-1.8.3 -r time -e 'p Time.parse("23 Aug 2005 19:00:01.1").to_f' 1124791201.1
ファイルをシフト時のレースコンディションが修正されました。
最後に定義したイベントハンドラが有効になるように修正しました。
1回メソッドを呼んでしまうと空になるバグを修正しました。
$ ruby-1.8.2 -e ' d = Dir.new("/") d.entries p d.entries ' [] $ ruby-1.8.3 -e ' d = Dir.new("/") d.entries p d.entries ' [".", "..", "dev", "home", "proc", "var", "tmp", "etc", "usr", "sbin", "bin", "boot"]
正規表現リテラル中で \c\\ 表記があるとパースエラーになるバグを修正しました。
$ cat r.rb p /[\c\\]/ =~ "\c\\" p /\c\\/ =~ "\c\\" $ ruby-1.8.2 r.rb r.rb:1: premature end of regular expression: /[\c\\]/ r.rb:2: invalid regular expression; '\' can't be last character: /\c\\/ $ ruby-1.8.3 r.rb 0 0
Delegator オブジェクトが生成された後に定義されたメソッドに関しても、適切に委譲するようになりました。 [ruby-talk:146776] [ruby-talk:146894]
$ cat test_dlg.rb foo = Object.new foo2 = SimpleDelegator.new(foo) def foo.bar puts "bar" end foo2.bar $ ruby-1.8.2 -r delegate test_dlg.rb test_dlg.rb:6: undefined method `bar' for #<Object:0x4021b0a0> (NoMethodError) $ ruby-1.8.3 -r delegate test_dlg.rb bar
うるう秒 "Fri Jan 1 08:59:60 +0900 1999" をサポートしている環境において、Time.parse が 適切に振舞うようになりました。
拡張ライブラリ socket.so が AIX 上でコンパイルされるようになりました。[ruby-list:40832]
クラスメソッドからクラス変数にアクセスするための Module#class_variable_get と Module#class_variable_set が 追加されました。[ruby-talk:144741]
class Fred @@foo = 99 def foo @@foo end end def Fred.foo @@foo = 101 #=> @@foo は Fred クラスのクラス変数ではない。 end def Fred.foo_foo class_variable_set(:@@foo, 101) # self が Fred クラス自身であることに注意。クラス変数 @@foo に値をセットする。 end Fred.foo # メソッドを呼んでも、Fred クラスのクラス変数 @@foo は変わらない。 p Fred.new.foo #=> 99 Fred.foo_foo # p Fred.new.foo #=> 101
WEBrick を CGI 環境下で使う場合、 request_line メソッドは REQUEST_URI ヘッダがあればそちらを優先して使うようになりました。 [ruby-dev:26235]
MSYS 環境下において、PATHの区切り値にセミコロンを使うよう修正しました。[ruby-dev:26232]
lib/getopts.rb が deprecated になりました。deprecated であるという警告は、 オプションに -w を付けた時に出ます。[ruby-dev:26201]
session_id を受け付けるようになりました。[ruby-core:4663]
decode_sjis と encode_sjis が 逆に定義されていたバグを修正しました。[ruby-core:4772]
特異クラスは複製できなくなりました。[ruby-talk:142749]
$ ruby-1.8.3 -e 'class << "str"; self end.dup' -e:1:in `initialize_copy': can't copy singleton class (TypeError) from -e:1
ディレクトリへのシンボリックリンクも削除されるようになりました。[ruby-core:4992]
各例外クラスのインスタンスが生成される時に、親クラスのコンストラクタ である Exception#initialize が呼ばれるようになりました。[ruby-talk:142593] [ruby-dev:26177]
メソッドを越えて break が有効になるバグを修正しました。[ruby-list:40818]
$ cat brk.rb def stop(n) break if n == 2 end (1..5).each do |i| stop(i) puts i end $ ruby-1.8.2 brk.rb 1 $ ruby-1.8.3 brk.rb 1 brk.rb:2:in `stop': unexpected break (LocalJumpError) from brk.rb:6 from brk.rb:5
オプション -s でアクセスできないグローバル変数ができてしまうバグを修正 しました。- を _ に変換してグローバル変数を定義するようになりました。- 以外の 記号がふくまれる場合は、例外 NameError を投げます。
$ ruby-1.8.2 -se 'puts global_variables.grep(/foo/)' -- --foo-bar $-foo-bar $ ruby-1.8.3 -se 'puts global_variables.grep(/foo/)' -- --foo-bar $_foo_bar $ ruby-1.8.3 -se 'puts global_variables.grep(/foo/)' -- --foo\@bar -e: invalid name for global variable - --foo@bar (NameError)
nil を VT_ERROR に変換して Invokeを呼び出して失敗するときには VT_EMPTYに変換して 再度 Invokeを呼び出すようにしました。
複数のDublin Coreの要素を扱えるようになりました。
このためdc_#{Dublin Coreの要素名の複数形}というメソッドが導入されました。
互換性のために以前のdc_#{Dublin Coreの要素名の単数形}というメソッドも残されています。
比較できないものを渡された時に false ではなく nil を返すようになりました。 [ruby-dev:25811]
$ ruby-1.8.2 -e 'p "a" <=> 1' false $ ruby-1.8.3 -e 'p "a" <=> 1' nil
レシーバを指定したメソッド呼び出しが、同名のローカル変数の有無によっ て影響されるバグが修正されました。 [ruby-dev:25737] <URL:http://yowaken.dip.jp/tdiary/20050220.html#p01>
Open3::popen3実行後の$?.exitstatusが0になるように修正されました。
defined?(@a = b)
のような NODE_IASGN が nil ではなく
"assignment" を返すようになりました。
[yarv-dev:418]
第一引数の意味が変わりました。
モジュール関数としても使えるようになりました。[ruby-dev:25687]
https をサポートするようになりました。
:http_basic_authentication
オプションの追加
[ruby-core:4416]
Imageモジュールのサポート
valueのエンコーディングを変換するメソッドを公開。
valueのエンコーディングは要素の内部エンコーディングからoutput_encoding=で設定したエンコーディングへ変換されます。
close, close_read, close_write が IO と同じように、 nil を返すようになりました。[ruby-dev:25623]
追加 (RFC2782)
Windows 上での File#flock(File::LOCK_UN) が正しく理解されないバグが 修正されました。[ruby-dev:25574]
環境変数 RUBYOPT の -T オプションを適切に解釈するようになりました。 またハイフン - を省略できるようになりました。[ruby-dev:25512]
$ env RUBYOPT='Ke rnet/http' ruby -e 'p Net::HTTP' Net::HTTP
オプション :SSLEnable のデフォルトが false になりました。
0.1.2 -> 0.1.3
継承するとエラーになるバグを修正。 [ruby-talk:126104]
特異クラスのメソッド superclass が特異クラスを返すように修正されました。 [ruby-list:40519]
nonblocking IO に対する IO#read の挙動は ruby 1.9 以降で変化します [ruby-dev:25101]。そのため、 ruby 1.8.3 以降では、VERBOSE モードの時に IO#read がノンブロッキングモードで データの読み込みに失敗して Errno::EAGAIN エラーが発生した場合、 "nonblocking IO#read is obsolete" という警告が出るようになりました。 そして ruby 1.8 の nonblocking IO#read の移行先として ruby 1.8.3 に IO#readpartial が追加されました。 [ruby-dev:25430] [ruby-dev:25443]
$ ruby -e 'sleep 1; print "hoge"' | ruby-1.8.2 -rio/nonblock -we ' io = IO.open(0) io.nonblock = true p io.read(4)' -e:4:in `read': Resource temporarily unavailable (Errno::EAGAIN) from -e:4 $ ruby -e 'sleep 1; print "hoge"' | ruby-1.8.3 -rio/nonblock -we ' io = IO.open(0) io.nonblock = true p io.read(4)' -e:4: warning: nonblocking IO#read is obsolete; use IO#readpartial or IO#sysread -e:4:in `read': Resource temporarily unavailable (Errno::EAGAIN) from -e:4 $ ruby -e 'sleep 1; print "hoge"' | ruby-1.8.3 -rio/nonblock -we ' io = IO.open(0) io.nonblock = true p io.readpartial(4)' "hoge" $ ruby -e 'sleep 1; print "hoge"' | ruby-1.9 -rio/nonblock -we ' io = IO.open(0) io.nonblock = true p io.read(4)' "hoge"
引数を与えない場合、可能なら /dev/urandom を参照するようになりました。[ruby-dev:25392]