ruby version 1.7 は開発版です。以下にあげる機能は将来削除されたり互換 性のない仕様変更がなされるかもしれません。
added
終了メッセージを指定できるようになった。
refine. ruby-dev:16193, ruby-dev:16213
複数のモジュールを渡したときにインクルードされる順序が変更されました。 ruby-dev:16035 extend も同様だそうです。ruby-dev:16183
module Foo; end module Bar; end module Baz; end include Foo, Bar, Baz p Object.ancestors => ruby 1.6.7 (2002-03-01) [i586-linux] [Object, Baz, Bar, Foo, Kernel] => ruby 1.7.2 (2002-03-01) [i586-linux] [Object, Foo, Bar, Baz, Kernel]
一つ一つ include した場合とは逆順になります。
module Foo; end module Bar; end module Baz; end include Foo include Bar include Baz p Object.ancestors => ruby 1.7.2 (2002-03-01) [i586-linux] [Object, Baz, Bar, Foo, Kernel]
追加
pack/unpack のテンプレートにコメントを記述できるようになりました。
p [1,2,3,4].pack("s # short (fixed 2 bytes) i # int (machine dependent) l # long (fixed 4 bytes) q # quad (fixed 8 bytes)") => ruby 1.7.2 (2002-02-21) [i586-linux] "\001\000\002\000\000\000\003\000\000\000\004\000\000\000\000\000\000\000"
これら疑似変数に特異メソッドが定義できるようになりました。
class <<true def foo "foo" end end p true.foo => -:1: no virtual class for true (TypeError) ruby 1.6.6 (2001-12-26) [i586-linux] => ruby 1.7.2 (2002-02-20) [i586-linux] "foo"
追加
def foo proc { return 10 } end begin foo.call rescue LocalJumpError p $!.exitstatus end => ruby 1.7.2 (2002-02-14) [i586-linux] 10
追加。Socket#listenと同じ。
追加
継承関係のないクラス/モジュール同士の比較で例外があがるようになりま した。
p Array <=> String => ruby 1.6.6 (2001-12-26) [i586-linux] 1 => -:1:in `<=>': non related class/module (ArgumentError) from -:1 ruby 1.7.2 (2002-02-14) [i586-linux]
追加
64 bit 整数のテンプレート文字 Q/q が追加されました(Quad の意)。 Q は unsigned、q は、signed です。 perl と異なり 64 bit 整数をサポートしないプラットフォームでも 使用できます。
p [ 1].pack("Q") p [-1].pack("Q") p [ 1].pack("q") p [-1].pack("q") p [ 1].pack("Q").unpack("Q") p [-1].pack("Q").unpack("Q") p [ 1].pack("q").unpack("q") p [-1].pack("q").unpack("q") => ruby 1.7.2 (2002-02-13) [i586-linux] "\001\000\000\000\000\000\000\000" "\377\377\377\377\377\377\377\377" "\001\000\000\000\000\000\000\000" "\377\377\377\377\377\377\377\377" [1] [18446744073709551615] [1] [-1]
特異メソッドに対する出力形式がより意味のあるものになりました。 ruby-bugs-ja:PR#193
obj = [] def obj.foo end p obj.method(:foo) => ruby 1.6.6 (2001-12-26) [i586-linux] #<Method: Array(Array)#foo> => ruby 1.7.2 (2002-02-05) [i586-linux] #<Method: [].foo>
ブロックの評価結果を fill する値として指定できるようになりました。ブ ロックは要素毎に評価されるので、下のような例では "val" が毎回生成さ れます。
ary = Array.new(3, "val") p ary.collect {|v| v.id } # => [537774036, 537774036, 537774036] ary = Array.new(3) { "val" } p ary.collect {|v| v.id } # => [537770040, 537770028, 537770016]
追加
s = File.stat("/dev/null") p s.rdev_major p s.rdev_minor => ruby 1.7.2 (2002-01-28) [i686-linux] 1 3
ブロックを指定できるようになりました。重複したキーに対する振舞いを制 御できます。
Numeric など immutable なオブジェクトは clone できなくなりました。 ruby-bugs-ja:PR#94, rubyist:0831
$DEBUG=true true.clone rescue nil false.clone rescue nil nil.clone rescue nil :sym.clone rescue nil (10**10).clone rescue nil 0.clone rescue nil => Exception `TypeError' at -:2 - can't clone true Exception `TypeError' at -:3 - can't clone false Exception `TypeError' at -:4 - can't clone nil Exception `TypeError' at -:5 - can't clone Symbol ruby 1.6.6 (2001-12-26) [i586-linux] => Exception `TypeError' at -:2 - can't clone TrueClass Exception `TypeError' at -:3 - can't clone FalseClass Exception `TypeError' at -:4 - can't clone NilClass Exception `TypeError' at -:5 - can't clone Symbol Exception `TypeError' at -:6 - can't clone Bignum Exception `TypeError' at -:7 - can't clone Fixnum ruby 1.7.1 (2001-10-10) [i586-linux]
汚染された Proc は、ブロックにできなくなる(かも) ruby-dev:15682
引数に基数(2,8,10,16)を指定できるようになりました。
p "010".to_i(16) => ruby 1.7.2 (2002-01-11) [i586-linux] 16
ハッシュのデフォルト値としてブロックを指定できるようになり ました。ブロックを指定すると空のハッシュ要素の参照に対して その都度ブロックを実行し、その結果を返します。 ブロックにはハッシュ自身と、ハッシュを参照したときのキーが渡されます
h = Hash.new("foo") p h.default.id p h.default(0).id # Hash#default はブロックに渡すキーを指定できます p h[0].id p h[0].id p h[1].id => ruby 1.7.2 (2001-12-10) [i586-linux] 537774276 537774276 537774276 537774276 h = Hash.new { "foo" } p h.default.id p h.default(0).id p h[0].id p h[0].id p h[1].id => ruby 1.7.2 (2001-12-10) [i586-linux] 537770616 537770352 537770316 537770280 h = Hash.new { raise IndexError, "undefined!!" } p h[0] => -:1: undefined!! (IndexError) from -:1:in `yield' from -:2:in `default' from -:2:in `[]' from -:2 ruby 1.7.2 (2001-12-10) [i586-linux]
追加
# ブロックを与えなかった場合は、indexes/indicies と同じです。 # (注: indexes/indicies は obsolete となっています) p [1,2,3].select(0,1,2,3) p [1,2,3].select(-4,-3,-2,-1) p( {1=>"a", 2=>"b", 3=>"c"}.select(3,2,1) ) => ruby 1.7.2 (2001-12-10) [i586-linux] [1, 2, 3, nil] [nil, 1, 2, 3] ["c", "b", "a"] # ブロックを与えた場合はこれまでの Enumerable#select と同じです。 p [1,2,3,4,5].select {|v| v % 2 == 1} p( {1=>"a", 2=>"b", 3=>"c"}.select {|k,v| k % 2 == 1} ) => ruby 1.6.6 (2001-12-04) [i586-linux] [1, 3, 5] [[1, "a"], [3, "c"]] => ruby 1.7.2 (2001-12-10) [i586-linux] [1, 3, 5] [[1, "a"], [3, "c"]]
追加。
m = /(foo)(bar)(baz)/.match("foobarbaz") p m.select(0,1,2,3,4) # same as m.to_a.indexes(...) p m.select(-1,-2,-3) => ruby 1.7.2 (2001-12-10) [i586-linux] ["foobarbaz", "foo", "bar", "baz", nil] ["baz", "bar", "foo"]
追加 re.match(str) と同じ。
Module.new, Class.new でブロックが与えられた場合、生成した モジュール/クラスのコンテキストでブロックを実行するように なりました。
第二引数に汚染された文字列を渡すと例外 SecurityError が 起こるようになりました。1.6 では、汚染された文字列をセーフレ ベル4で評価するようになっていました。 ruby-list:32215
puts は、配列を特別扱いしなくなり、Array#to_s が出力されるようになりました。Array#to_s は、 デフォルトで間に改行を挟んだ文字列を出力するように変更され たため挙動に違いはありません(ただし $, の 値に影響されます)。ruby-dev:15043
この変更は、まだ試験的ですが元に戻りそうな気配。。。ruby-dev:15313
$, = "," puts %w(foo bar baz) => ruby 1.6.5 (2001-11-01) [i586-linux] foo bar baz => ruby 1.7.2 (2001-11-25) [i586-linux] foo,bar,baz
・・・元に戻ったようです。
=> ruby 1.7.2 (2001-12-10) [i586-linux] foo bar baz
引数に基数を指定できるようになりました。
p 10.to_s(16) => ruby 1.7.2 (2001-11-25) [i586-linux] "a"
$/ が "\n" (デフォルト)のとき、どの行末形式("\r\n", "\r", "\n" のいずれでも)でもそれらを取り除くようになりました。
p "aaa\r\n".chomp => ruby 1.6.5 (2001-11-01) [i586-linux] "aaa\r" => ruby 1.7.2 (2001-11-25) [i586-linux] "aaa"
Complex#to_i, #to_f, #to_r はなくなりました。 ruby-bugs-ja:PR#102, rubyist:0879
メソッド名と括弧の間に空白があるとその括弧は引数を括る括弧ではなく 式の括弧と解釈するようになりました。 *1 *2
p (1+2)*3 => -:1: warning: p (...) interpreted as method call -:1: warning: useless use of * in void context ruby 1.6.5 (2001-09-19) [i586-linux] 3 -:1: undefined method `*' for nil (NameError) => -:1: warning: p (...) interpreted as command call ruby 1.7.1 (2001-06-05) [i586-linux] 9
構造体クラスのサブクラスをダンプしたものがロードできませんでした。 ruby-bugs-ja:PR#104
S = Struct.new("S", :a) class C < S end p Marshal.load(Marshal.dump(C.new)) => -:4: warning: instance variable __member__ not initialized -:4:in `dump': uninitialized struct (TypeError) from -:4 ruby 1.6.5 (2001-09-19) [i586-linux] => ruby 1.7.1 (2001-10-19) [i586-linux] #<C a=nil>
グローバル変数のエイリアスが効いていませんでした。 ruby-dev:14922
$g2 = 1 alias $g1 $g2 p [$g1, $g2] $g2 = 2 p [$g1, $g2] => ruby 1.6.5 (2001-09-19) [i586-linux] [1, 1] [1, 2] => ruby 1.7.1 (2001-10-19) [i586-linux] [1, 1] [2, 2]
ブロックを持てるようになりました。ブロックの実行は module_eval と同じように、そのモジュール/クラスのコンテキ スト(self が そのモジュール/クラス)で実行されます
Module.new {|m| p m} => ruby 1.7.1 (2001-10-15) [i586-linux] #<Module:0x401afd5c>
追加
p "foobarbaz"[/(foo)(bar)(baz)/, 1] p /(foo)(bar)(baz)/.match("foobarbaz").to_a[1] => -:2: warning: ambiguous first argument; make sure ruby 1.7.1 (2001-10-05) [i586-linux] "foo" "foo" str = "foobarbaz" p str[/(foo)(bar)(baz)/, 2] = "BAR" # => "BAR" p str # => "fooBARbaz"
str[/re/, 0] は、str[/re/] と同じです。
Array.new の引数に配列を渡すとそのコピーを生成するようになりました。
ary = [1,2,3] ary2 = Array.new ary p ary, ary2 p ary.id, ary2.id => ruby 1.7.1 (2001-10-05) [i586-linux] [1, 2, 3] [1, 2, 3] 537758120 537755360
String.new の引数を省略できるようになりました。
p String.new => -:1:in `initialize': wrong # of arguments(0 for 1) (ArgumentError) from -:1:in `new' from -:1 ruby 1.7.1 (2001-08-29) [i586-linux] => ruby 1.7.1 (2001-10-05) [i586-linux] ""
追加
p Dir.open(".").path => ruby 1.7.1 (2001-10-05) [i586-linux] "."
〜この間、空白期間〜
Readline.readline 実行中に Ctrl-C により中断した後でも、端末状態を 復帰するようにしました。ruby-dev:14574
追加(Module#included の再定義)
追加。
while, until, class, def が式として値を返すようになりました。
p(while false; p nil end) p(while true; break "bar" end) p(class Foo; true end) p(module Bar; true end) p(def foo; true end) => -:1: void value expression -:2: void value expression -:3: void value expression -:4: void value expression -:5: void value expression ruby 1.7.1 (2001-08-20) [i586-linux] => -:1: warning: void value expression -:2: warning: void value expression -:3: warning: void value expression -:4: warning: void value expression -:5: warning: void value expression ruby 1.7.1 (2001-08-23) [i586-linux] false "bar" true true nil
while/until は途中で nil を返すように修正されました。 ruby-dev:15909
=> -:1: warning: void value expression -:2: warning: void value expression -:3: warning: void value expression -:4: warning: void value expression -:5: warning: void value expression ruby 1.7.2 (2002-02-20) [i586-linux] nil "bar" true true nil
文字列の範囲オブジェクトと文字列との比較を行う場合に、 以前は範囲の両端と比較していましたが、String#upto により1要素ずつ 比較を行うようになりました。
p(("a" .. "ab") === "aa") => ruby 1.7.1 (2001-08-20) [i586-linux] true => ruby 1.7.1 (2001-08-23) [i586-linux] false
追加。ruby-dev:8986以降で提案された Schwartzian transform を行うための sort です。
Updated. New methods and constants for using the mouse, character attributes, colors and key codes have been added.
追加。step ごとの要素で繰り返します。
条件式中の正規表現リテラルは警告が出るようになりました。
$_ との正規表現マッチは、明示的に ~/re/ (単項の ~ メソッ ド)などとすることが推奨されます。
$_ = "foo" p $_ if /foo/ p $_ if /bar/ => -:2: warning: regex literal in condition -:3: warning: regex literal in condition ruby 1.7.1 (2001-08-14) [i586-linux] "foo"
追加。左端あるいは右端の空白類を取り除きます。
追加。ソケットアドレス構造体(INET domain)のpack/unpack。
追加。ソケットアドレス構造体(UNIX domain)のpack/unpack。
追加。アルファベットの大小を無視した文字列比較。
$= の値に関らず常にアルファベットの大小を区別するよ うになりました。
Added. ruby-dev:13941
Changed to warn only when invoked from multiple threads or no block is given. ruby-dev:13823
Dir.chdir("/tmp") pwd = Dir.pwd #=> "/tmp" puts pwd Dir.chdir("foo") { pwd = Dir.pwd #=> "/tmp/foo" puts pwd Dir.chdir("bar") { # <-- previously warned pwd = Dir.pwd #=> "/tmp/foo/bar" puts pwd } pwd = Dir.pwd #=> "/tmp/foo" puts pwd } pwd = Dir.pwd #=> "/tmp" puts pwd
引数の数をチェックしない点を除けば Proc#call と同じです。
追加
このメソッドで使用するフラグ FNM_NOESCAPE, FNM_PATHNAME, FNM_PERIOD, FNM_CASEFOLD もFile::Constants モジュールに定義されました。
p %w(foo bar bar.bak).reject! { |fn| File::fnmatch?("*.bak", fn) } => ruby 1.7.1 (2001-06-12) [i586-linux] ["foo", "bar"]
追加
多重代入の規則を見直しました。変更は以下の点だけです。
# *a = nil p a => ruby 1.7.1 (2001-06-05) [i586-linux] [nil] => ruby 1.7.1 (2001-06-12) [i586-linux] []
以下の挙動を修正しました。
a = *[1] p a #=> [1]
現在は、1要素の配列も正常に展開されます。
a = *[1] p a #=> 1
NameError を StandardError のサブクラスに戻しました。 クラス階層は以下のようになりました。
NoMethodError < NameError < StandardError.
第2引数を数値(File::RDONLY|File::CREATとか)で指定した場合に限り、第3 引数を用いていましたが、第3引数が与えられれば常に有効にするように しました。 ruby-bugs-ja:PR#54
無名のクラス/モジュールは dump できないようになりました。
p Marshal.dump(Class.new) => ruby 1.6.4 (2001-06-04) [i586-linux] "\004\005c\031#<Class 0lx401a6b44>" => -:1:in `dump': can't dump anonymous class #<Class 0lx401a73dc> (ArgumentError) from -:1 ruby 1.7.1 (2001-08-24) [i586-linux]
モジュールのロードの型チェックに誤りがありました。この変更によりdump フォーマットのマイナーバージョンが1あがりました
p Marshal.dump(Object.new).unpack("CC").join(".") => ruby 1.6.4 (2001-06-04) [i586-linux] "4.5" p Marshal.dump(Object.new).unpack("CC").join(".") => ruby 1.6.4 (2001-06-11) [i586-linux] "4.6"
内部のハッシュテーブルを使用することにより定数参照の速度を改善したそうです。 (ChangeLogの
Tue Jun 5 16:15:58 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
に該当するようです)
以下のようなコード(pの後の空白に注意)
p ("xx"*2).to_i
は、
(p("xx"*2)).to_i
ではなく
p (("xx"*2).to_i)
とみなすようになりました(これはまだ実験的な変更です)。
追加。これにより(配列への暗黙の変換が適用されるので)以下のように書く ことができます。
a, b, c = 1..3
break, next は、引数を指定することでイテレータや yield の値を返す ことができるようになりました。(この機能はまだ実験です)
break [n] はイテレータを終了させ、n がそのイテレータの返り値になります。 next [n] はブロックを抜け、n が yield の返り値になります。
def foo p yield end foo { next 1 } def bar yield end p bar { break "foo" } => ruby 1.7.1 (2001-08-20) [i586-linux] 1 "foo"
to_str を定義したオブジェクトはより広範囲にStringとして振舞うように なりました。
文字列を引数に取るほとんどの組込みメソッドは、to_str による暗黙の 型変換を試みます。
foo = Object.new class <<foo def to_str "foo" end end p File.open(foo) => -:7:in `open': wrong argument type Object (expected String) (TypeError) ruby 1.6.4 (2001-04-19) [i586-linux] => -:7:in `open': No such file or directory - "foo" (Errno::ENOENT) ruby 1.7.0 (2001-05-02) [i586-linux]
範囲演算子式中の単独の数値リテラルが $.
と比較されるのは
-e オプションによる1行スクリプトの中だけになりました。
発生した例外 $! と rescue 節の例外クラスとは Module#=== を使って比較するようになりました。
以前は kind_of? による比較なので基本的な動作に変わりはありませんが、 SystemCallError.=== は特別に errno が一致する例外を同じと見なすよう に再定義されました。これにより、例えば Errno::EWOULDBLOCK と Errno::EAGAIN が同じ意味(同じerrno)の場合にどちらを指定しても rescue できるようになりました。
Array#collect がブロックを伴わない場合に self.dup を返していました。 そのため、Array 以外を返すことがありましたruby-list:30480。
Foo = Class.new Array a = Foo.new p a.map.class p a.collect.class => ruby 1.7.1 (2001-06-12) [i586-linux] Array Foo => ruby 1.7.1 (2001-07-31) [i586-linux] Array Array
dup のバグ修正 ruby-list:30481
class Foo < Array attr_accessor :foo end a = Foo.new a.foo = 1 b = a.dup b.foo b.foo = 99 p b.foo # => ruby 1.6.4 (2001-06-04) [i586-linux] nil # => ruby 1.6.4 (2001-07-31) [i586-linux] 99
追加
ary[n,0] = [other,...]
と同じ(ただし self を返す)
ary = [0,1,2,3] ary[2, 0] = [4, 5, 6] p ary ary = [0,1,2,3] ary.insert(2, 4, 5, 6) p ary
Array#pack, String#unpack のテンプレート文字 "p", "P" は、nil と NULLポインタの相互変換を行うようになりましたruby-dev:13017。
p [nil].pack("p") p "\0\0\0\0".unpack("p") => ruby 1.7.0 (2001-05-17) [i586-linux] "\000\000\000\000" [nil]
常にself返すようになりました。
将来にわたってこのことが保証されるわけではないそうです ruby-dev:12506。
(注: Class#inherited ではありません)
以前は、クラスのサブクラスの定義を禁止するために定義されていましたが、 (TypeError例外を発生させるメソッドとして定義されていました) こ の役割は Class.new が担保するようになりました。そのため、 Class.inherited メソッドの定義はなくなりました。
class SubClass < Class end #=> -:1:in `inherited': can't make subclass of Class (TypeError) from -:1 ruby 1.7.1 (2001-06-12) [i586-linux] #=> -:1: can't make subclass of Class (TypeError) ruby 1.7.1 (2001-07-31) [i586-linux]
ブロックを伴う場合File.openと同様に、ブロックの結果がメソッドの
戻り値になりました。(1.6以前は nil
固定)
ブロックを指定できるようになりました。
先行するバックスラッシュにより、ワイルドカードをエスケープ できるようになりました。 また、空白類に特殊な意味はなくなりました('\0'の効果は残っています)。
追加
追加
追加
追加。ruby-talk:9460が実装に至った経緯だと思う
Interrupt は、SignalExceptionのサブクラスになりました。 (1.6以前はExceptionのサブクラス)
追加。Marshal が出力するダンプフォーマットのバージョン番号です。 ruby-dev:14172
Regexp#match の利便のために用意されました。以前は、
foo, bar, baz = /(\w+?)\s+(\w+?)\s+(\w+)/.match("foo bar baz").to_a[1..-1] p [foo, bar, baz]
とする必要がありましたが、これにより
_, foo, bar, baz = /(\w+?)\s+(\w+?)\s+(\w+)/.match("foo bar baz") p [foo, bar, baz]
とすることができます。
追加
追加。Module#append_feature の後に呼ばれるhook
追加
追加。商を返します。
旧称は削除されました。NotImplementedErrorを使ってください
追加
省略可能な引数 all が追加されました。
class Foo def foo end end obj = Foo.new module Bar def bar end end class <<obj include Bar def baz end end p obj.singleton_methods #=> ["baz"] p obj.singleton_methods true #=> ["baz", "bar"]
Time.times から移動しました。 (Time.times も残っていますが、warningが出ます)
追加。$?
の値も整数からこのクラスのインスタンスになりました。
追加
追加
追加。to_a と同じ
optional な引数が追加されました。
追加
追加。大文字小文字の区別をせずに文字列を比較。
追加
str[n, 0] = other
と同じ(ただし self を返す)
追加
追加 (上記 「rescue 節の...」 を参照のこと) ruby-dev:12670
追加
ローカル側アドレスを省略可能な第3,4引数で指定できるようになりました。
追加。Thread固有データのキーの配列を返します。
負の time_t を扱えるようになりました(OSがサポートしている場合に限る)
p Time.at(-1) => Thu Jan 01 08:59:59 JST 1970
gmtime なタイムゾーンに対して"UTC"を返すようになりました (以前は環境依存。大抵の場合"GMT")
以下、未検証 (ruby-dev:13476 まだ仕様が確定してないらしい。メモの 意味も込めてそのまま残します。ruby-dev:14601, ruby-dev:15927 も参照)
Sat Feb 24 03:15:49 2001 Yukihiro Matsumoto <matz@ruby-lang.org> * io.c (set_stdin): preserve original stdin. * io.c (set_outfile): preserve original stdout/stderr.
*1p (1, 2) とすると空白があっても引数を括る括弧になる
*2なんか、うまい書き方ないですかねえ?rubyist:0894
*3以下は 1.6 へ