Ruby1.9.1NEWS
NEWSファイルについて
この文書は、バグフィックスを除いて、ユーザから目に見える変更点を列挙したものです。
それぞれのエントリは、その背景や参考情報を端折ってしまうくらい簡潔にまとめられていることに注意してください。全ての変更点のリストとしては、 ChangeLog ファイルを参照してください。
1.8 と 1.9 の互換性の問題
言語の中核部分
新しい文法と意味
- ブロック引数は全てローカルスコープになりました
- ブロック引数の意味が新しくなりました
- defined?とローカル変数
- パーサはソースコードがある文字エンコーディングに対してvalidなバイト列であることを期待するようになりました。どのエンコーディングを使っているのかを、マジックコメントでパーサーに知らせてください。
- instance_evalやmodule_evalの中での定数定義の意味が変わりました。
廃止された文法
- if/unlessやcase表現において、thenの代わりにコロン(:)の利用は禁止されました
- ループやイテレータの中での retry は禁止されました
組み込みクラスとオブジェクト
KernelとObject
- Object#methodsと#singleton_methodsは文字列の配列を返していましたが、シンボルの配列を返すようになりました
ClassとModule
- Module#attr はデフォルトで Module#attr_reader として働く。オプションの真偽値引数は廃止予定です
- Module#instance_methods, Module#private_instance_methods, および Module#public_instance_methods は文字列の配列を返して いましたが、シンボルの配列を返すようになりました
- UnboundMethods へ bind するときにチェックが厳しくなりました
Exception
- 同じクラスに属し、同じメッセージとバックトレースを持つ例外は互いに等価になりました。
- SystemStackError が StandardError のサブクラスから、Exception の直接のサブクラスになりました。
- SecurityError: 上に同じ。
- Exception#to_str を削除しました。
Enumerable と Enumerator
- 互換性のために定義されていた Enumerator の別名 Enumerable::Enumerator は削除されました。
- Enumerable#map,collect_all は、ブロック無しで呼ばれるとenumeratorを返します。
- その他、様々な組み込み/添付ライブラリは、ブロック無しのイテレータ呼び出しがenumeratorを返すようになりました。
Array
- Array#nitemsは削除されました。count{|i| !i.nil?} を使ってください。
- Array#choiceは削除されました。 #sampleを使ってください。
- Array#[m,n] = nil は被代入位置にnilを置くだけになりました。
Hash
- Hash#to_sの出力はHash#inspectと同じになりました。
- Hash#eachとHash#each_pairの意味が変わりました。
- Hash#select はハッシュを返します。
- Hash#index は Hash#key に改称しました。古い名前は将来廃止予定です。
- ハッシュが順序を保持します。要素を、キーが挿入された順に列挙するようになりました。
- ENV や *DBM のようなハッシュ風インターフェースの多くは、同様に変更されました。
IO操作
- 多くのメソッドはバイトごとではなく文字ごとに動作するようになりました。バイトごとに動作する代替メソッドも用意してあります。
- IO#getc は「1文字」を読み取ります。
- ブロックしないIO (Non-blocking IO)
- Kernel#openは改行を扱うために"t"オプションを取ります。
- Kernel#openはエンコーディング指定を受け付けます。
- IOオブジェクトは、指定があればバイト列を自動的にある文字エンコーディングから他のエンコーディングへ変換します。
- StringIO#readpartial
- IO.try_convert
- IO.binread
- IO.copy_stream
- IO#binmode?
- IO#close_on_exec= と IO#close_on_exec?
- 次のメソッドの読み出し上限
- IO#ungetc, StringIO#ungetc
- IO#ungetbyte, StringIO#ungetbyte
- IO#internal_encoding, IO#external_encoding, IO#set_encoding
- IO.pipeはエンコーディング指定を受け取るようになりました。
- printfスタイルの整形において、ディレクティブ %u は負の数に対して %d のように振る舞います。
File と Dir の操作
- 次のメソッドにおいて、必要ならば#to_pathが呼ばれます :
- File.world_readable?
- File.world_writable?
- Dir.[], Dir.glob
- Dir.exist?
- Dir.exists?
File::Stat
String
- Enumerableではなくなりました。行単位の操作には #each_line や #lines を使ってください。
- エンコーディングを認識: 多くのメソッドは1バイトごとではなく1文字ごとに振る舞います。
- String#[]: 整数添字を与えると、整数ではなく1文字からなる文字列を返します。
- String#[]=: 右辺に整数を取ることができなくなりました。次項より、"str[i] = ?c" を検討してください。
- 文字リテラル ?c は整数ではなく1文字だけの文字列に評価されます。
Regexp
- エンコーディングを認識
- 自身のエンコーディングと互換なエンコーディングの文字列に対してのみマッチします。
- Regexp#kcode は削除されました。 Regexp#encoding を使ってください。
Symbols
- シンボルリテラルの制限変更
Numeric
- Numeric#divは常にInteger#divと同じように丸めます。
- Numeric#fdiv: 同上
Integer
- Integer(nil) は TypeError を投げます。
Fixnum
- Fixnum#id2name は削除されました。
- Fixnum#to_sym は削除されました。
Struct
- Struct#inspect
Time
- Time#to_sの新しいフォーマット
- Marshal.dump/load でタイムゾーン情報を保ちます。
$SAFEと関連メソッド
- tainted/untaintedモデルに加えて、新しく導入されたtrusted/unstrustedモデル
Thread
- Thread.criticalとThread.critical=は削除されました。
- Thread#exit!, Thread#kill!, Thread#terminate!は削除されました。
廃止
- $= (文字列マッチングの大文字/小文字を区別するかどうかのグローバルなフラグ
- Kernel#to_a
- Kernel#getc, #gsub, #sub
- Kernel#callccとContinuationクラスは添付ライブラリ'continuation'になりました。
- Object#type
- ArrayおよびHashから#indices, #indexesが削除されました。
- Hash#index
- ENV.index
- Process::Status#to_int
- Numeric#rdiv
- Precision モジュールは削除されました。でもご安心を。再設計して将来のバージョンで復活します。
- Symbol#to_int and Symbol#to_i
- $KCODEは機能しなくなりました。各クラスのEncoding関連の機能を使ってください。
- VERSION定数の類々
添付ライブラリ (bundled libraries)
Pathname
- #to_strも#=~も持たなくなりました。
time と date (time and date)
- Time.parseとDate.parseはスラッシュ区切りの日付を"dd/mm/yyyy"のように解釈します。
Readline
- もしlibeditを使っていれば、Readline::HISTORY[0]は最初のヒストリを返します。
Continuation
- 上記参照 (as above)
廃止(Deprecation)
- Complex#image: Complex#imagを使ってください
- Net::SMTPのすべてのSSL関係のクラスメソッド
- Prime#cache, Prime#primes, Prime#primes_so_far
- mailreadライブラリ: tmail gemを使ってください
- cgi-libライブラリ: cgiを使ってください
- date2ライブラリ: dateを使ってください。
- eregexライブラリ (eregex library)
- finalizeライブラリ: 本当にどうしても絶対に頑として疑う余地無くファイナライザが必要だというのであれば ObjectSpece.define_finalizer を使ってください。
- ftoolsライブラリ: fileutilsを使ってください。
- generatorライブラリ: Enumerator#next を使ってください。
- importenvライブラリとEnvライブラリ。
- jcodeライブラリ: 文字列の他言語サポートを使ってください。
- parsedateライブラリ (parsedate library)
- pingライブラリ (ping library)
- readbytesライブラリ (readbytes library)
- getoptsライブラリとparseargライブラリ: optparseまたはgetoptlongを使ってください。
- soap, wsdl, xsdの各ライブラリ: soap4r gemを使ってください。
- Win32APIライブラリ: dlを使ってください。
- dlライブラリ: 再実装され、APIが変わりました。新しいバージョンのdlやffi gemを使ってください。
- rubyunit, runitライブラリ: minitestかtest/unitを使ってください。もしくは、RubyGemsを通じて何でも好きなライブラリを使ってください。
- test/unitはminitestに基づいて再実装されました。これは元のものと完全に互換ではありません。
言語の中核部分 (Language core changes)
新しい文法と意味論 (New syntax and semantics)
- ソースコードの文字エンコーディングを宣言するためのマジックコメント
- ハッシュリテラルとハッシュ形式の引数のための新しい記法
- 新しいlambda記法
- .()で#callや#[]を使わずにProcなどを呼べる
- ブロックの引数としてのブロック
- ブロックローカル変数
- オプション引数より後に必須引数を置ける
- 複数個の実引数展開を書ける。
- #[]呼び出しは実引数展開やハッシュスタイル引数、ブロック引数をとることができる。
- printf形式の整形の新しいディレクティブ
- 条件演算子の(:)の前やメソッド呼び出しの(.)の前で改行してもよい。
- !, !=, !~のような否定演算子がオーバーロード可能になった。
- Encoding.default_external and default_internal
- __ENCODING__: 現在のスクリプトエンコーディングを保持する新しい擬似変数
組み込みクラスとオブジェクトの変更
KernelとObject (Kernel and Object)
- BasicObject
- Object#~ はデフォルトではfalseではなくnilを返す
- Kernel#define_singleton_method
- Kernel#loadは各gemの最新版からライブラリをロードできる
ClassとModule (Class and Module)
- Module#const_defined?, #const_get, #method_defined?がオプションの引数をとる
- #class_variable_{set,get}はpublicメソッドになりました。
- 特異クラスのクラス (Class of singleton classes)
Errno::EXXX
- これらの定数全てが常に定義されます。Errno::EXXXは、そのエラーコードを持たないプラットフォームではErrno::NOERRORの別名になります。
Binding
- Binding#eval
Blocks and Procs
- 引数を持たないブロックのArity
- procはProc.newの別名になりました。
- Proc#yield: ブロックを#[]に渡せます。 (Passing blocks to #[])
- Proc#lambda?
- Proc#curry
Fiber: セミコルーチンあるいはマイクロスレッド (semi-coroutines/micro-threads)
EnumerableとEnumerator (Enumerable and Enumerator)
- Enumerable#each_with_indexは#eachに渡すための引数を取ることが出来ます。
- Enumerable#each_with_object
- Enumerator#with_object
- Enumerator.new { ... }
Array
- Array#deleteは与えられたオブジェクトではなく削除された要素を返します。
- Array#to_sはArray#inspectと同様のフォーマットで返すようになりました。
- Array.try_convert
- Array#pack('m0')はRFC4648に従います。
Hash
- 要素の挿入順序を保持します。 (preserving item insertion order)
- Hash#default_proc=
- Hash#_compare_by_identityとHash#compare_by_identity?
- Hash.try_convert
- Hash#assoc
- Hash#rassoc
- Hash#flatten
Range
- Range#cover?
- Range#min, Range#max
- Range#include?
範囲が数値でない限り、要素に対して繰り返して与えられた値との比較を行います。以前のように両端との比較による動作を望む場合はRange#cover?を使ってください。
FileとDirの操作 (File and Dir operations)
- 新しいメソッドがいくつか (New methods)
Process
- Process.spawn
- Process.daemon
String
- String#clear
- String#ord
- String#getbyte, String#setbyte
- String#charsとString#each_charが1文字ごとに動作します。
- String#codepoints, String#each_codepoint
- String#unpackはブロックを取ることが出来るようになりました。
- String#hash
- String.try_convert
- String#encoding
- String#force_encoding, String#encode and String#encode!
- String#ascii_only?
- String#valid_encoding?
- String#match
Symbol
- 長さ0のシンボルが生成可能になりました。
- Symbol#intern
- Symbol#encoding
- SymbolにStringに似たメソッドがいくつか入りました。
Regexp
- Regexp#=== がシンボルともマッチします。
- Regexp.try_convert
- Regexp#match
- Regexp#fixed_encoding?
- Regexp#encoding
- Regexp#named_captures
- Regexp#names
MatchData
- MatchData#names
- MatchData#regexp
Encoding
Encoding::Converter
- 多くのエンコーディングの間での変換を提供します。
Numeric
- Numeric#upto, #downto, #times, #step
- Numeric#real?, Complex#real?
- Numeric#magnitude
Rational / Complex
- 組み込みライブラリになりました。
Math
- Math#logがオプションの引数を取るようになりました。
- Math#log2
- Math#cbrt, Math#lgamma, Math#gamma
Time
- Time#timesは削除されました。Process.timesを使ってください。
- Time#sunday?
- Time#monday?
- Time#tuesday?
- Time#wednesday?
- Time#thursday?
- Time#friday?
- Time#saturday?
- Time#tv_nsec and Time#nsec
その他の新しいメソッド (Misc. new methods)
- Ruby処理系実装を区別するためのRUBY_ENGINE定数
- public_method
- public_send
- GC.count
- ObjectSpace.count_objects
- Method#hash, Proc#hash
- Method#source_location, UnboundMethod#source_location and Proc#source_location
- __callee__
- $LOAD_PATHと$LOADED_FEATURESの要素は絶対パスに展開されます。
添付ライブラリ
RubyGems
- Ruby用パッケージ管理システム (Package management system for Ruby.)
- Rubyのライブラリローダと統合 (Integrated with Ruby's library loader.)
Rake
- Ruby版Make。Makeと似た機能を持つ、シンプルなRubyビルドプログラム。
minitest
- test/unitよりも早くてきれいで読みやすい新しいテスティングライブラリ
- 必要に応じてtestunit gem でtest/utniを導入可能
CMath
- 複素数版Math (Complex number version of Math)
Prime
- Mathnから抽出・改良されたライブラリ。素数の列挙が簡単にできる。
- Prime.newは廃止。代わりにクラスメソッドを使用すること。
ripper
- Rubyスクリプトの構文解析器 (Ruby script parser)
Readline
- Readline.vi_editing_mode?
- Readline.emacs_editing_mode?
- Readline::HISTORY.clear
Tk
- TkXXXウィジェットクラスは削除し、Tk::XXXクラスのエイリアスとして再定義
RDoc
- バージョン2.2.2にアップデート。
- See: http://rubyforge.org/frs/shownotes.php?group_id=627&release_id=26434
コマンドラインオプション (commandline options)
- -E, --encoding
- -U
- --enable-gems, --disable-gems
- --enable-rubyopt, --disable-rubyopt
- 長いオプションが環境変数RUBYOPTでも許されるようになった
実装の変更点 (Implementation changes)
記憶領域節約
- オブジェクト省メモリ化- Object, Array, String, Hash, Struct, Class, Module
- st_tableの圧縮 (小さいテーブルのインライン化)
YARV
- Rubyのコードは実行前にopcodeにコンパイルされる。
- ネイティブスレッド (Native thread)
プラットフォームのサポート
サポートレベル
- (0) Supported
- (1) Best effort
- (2) Perhaps
- (3) Not supported
廃止
- djgpp, bcc32, human68k, MacOS 9以前, VMSおよびWindows CEはサポートしなくなりました。
( 英語版オリジナル: http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/tags/v1_9_1_0/NEWS?view=markup )
Keyword(s):
References:[1.9 Links]