?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
ruby version 1.6是穩(wěn)定版。在該版本中,主要修改了一些bug。
stable-snapshot是穩(wěn)定版的源代碼,且每日更新。
在EAGAIN與EWOULDBLOCK同值的系統(tǒng)中,EWOULDBLOCK消失不見了?,F(xiàn)在,這種系統(tǒng)中的EWOULDBLOCK被定義為EAGAIN。(這點與1.6.7不同)
p Errno::EAGAIN p Errno::EWOULDBLOCK => ruby 1.6.7 (2002-03-01) [i586-linux] Errno::EAGAIN Errno::EWOULDBLOCK => ruby 1.6.8 (2002-12-24) [i586-linux] Errno::EAGAIN -:2: uninitialized constant EWOULDBLOCK at Errno (NameError) => ruby 1.6.8 (2003-02-13) [i586-linux] Errno::EAGAIN Errno::EAGAIN
在Cygwin中,有時無法切換Thread。 [ruby-list:36058], [ruby-list:24637]
好像解決了一個Windows中的socket問題。(從原來的郵件中無法得到具體的問題描述,但好像是:雖然可以用select來進行讀入,但返回的是空數組) [ruby-talk:40015], [ruby-win32:366]
有時用trap捕獲信號時卻并沒有保存線程的狀態(tài),導致被信號中斷的線程狀態(tài)混亂[ruby-talk:40337], [ruby-core:00019]
Queue#pop中存在競爭問題[ruby-dev:17223]
修改了可接受0以下的參數的bug。
在stable snapshot中,曾經有一段時間,需要對展開式中引號使用反斜線轉義。該變更解決了這個問題。
p "#{ "" }" => ruby 1.6.7 (2002-03-01) [i586-linux] "" => -:1: warning: bad substitution in string ruby 1.6.7 (2002-09-12) [i586-linux] "#{ }" => ruby 1.6.7 (2002-09-25) [i586-linux] ""
這并不是1.7之后的backport。在處理注釋等對象時,與1.7有所不同。(請參考ruby 1.7 特性的2002-06-24)
p "#{ "" # comment }" => ruby 1.6.8 (2002-10-04) [i586-linux] "" => -:1: parse error ruby 1.7.3 (2002-10-04) [i586-linux]
添加(push, pop的別名)。以前尚未定義它們時,調用enq等就會執(zhí)行超類Queue的enq。
添加[ruby-dev:17221]
在mswin32版和mingw32版的ruby中,從1.6.6版起就有一個bug:ruby的子進程無法接收環(huán)境變量。[ruby-dev:18236]
在使用Bison編譯的Ruby中,多次加載庫的速度有所提高。(若不使用Bison的話,每次加載時,好像都會顯式地執(zhí)行GC,所以運行速度會下降) [ruby-dev:18145]
Cygwin 1.3.x [ruby-bugs-ja:PR#299]
p File.expand_path('file', 'c:/') => ruby 1.6.7 (2002-03-01) [i586-linux] /tmp/c:/file => ruby 1.6.7 (2002-08-21) [i586-linux] c:/file
以前,同時使用Ruby線程和Win32的結構化異常(包括來自Win32 API的callback)的話就會引起故障?,F(xiàn)在該bug已被修復。[ruby-win32:273]
以前,只要兩個Hash對象的默認值(default)==的話,它們也就被看作相等。
p Hash.new("foo") == Hash.new("bar") => ruby 1.6.7 (2002-03-01) [i586-linux] true => ruby 1.6.7 (2002-08-21) [i586-linux] false
以前,若指定了范圍之外的字符串的話,有時會返回異?!,F(xiàn)在統(tǒng)一返回nil。(也就是返回與String#[]或String#slice一樣的結果)
p "foo".slice!("bar") # <- 以前此處返回 nil p "foo".slice!(5,10) => ruby 1.6.7 (2002-03-01) [i586-linux] nil -:2:in `slice!': index 5 out of string (IndexError) from -:2 => ruby 1.6.7 (2002-08-01) [i586-linux] nil nil
現(xiàn)在可以給第一個參數指定nil了。[ruby-talk:43513] 此時把$;當作分割字符串。以前,只有省略參數時才能使用$;。
$; = ":" p "a:b:c".split(nil) => -:2:in `split': bad separator (ArgumentError) from -:2 ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.6.7 (2002-07-30) [i586-linux] ["a", "b", "c"]
以前,Dir.glob不會匹配已斷鏈的符號連接。
File.symlink("foo", "bar") p Dir.glob("bar") => ruby 1.6.7 (2002-03-01) [i586-linux] [] => ruby 1.6.7 (2002-08-01) [i586-linux] ["bar"]
以前,無法用Hash[]來dup & freeze鍵字符串。
a = "key" h = Hash[a,"val"] h.keys[0].upcase! p a => ruby 1.6.7 (2002-03-01) [i586-linux] "KEY" => -:3:in `upcase!': can't modify frozen string (TypeError) from -:3 ruby 1.6.7 (2002-08-01) [i586-linux]
有時對負數進行右移位時,就會變成0。 [ruby-bugs-ja:PR#247]
以負數為參數的左移位(即右移位)中也會出現(xiàn)這種問題。[ruby-bugs-ja:PR#248]
p(-1 >> 31) => ruby 1.6.7 (2002-03-01) [i586-linux] 0 => ruby 1.6.7 (2002-08-01) [i586-linux] -1 p(-1 << -1) => ruby 1.6.7 (2002-03-01) [i586-linux] -2147483649 => ruby 1.6.7 (2002-08-01) [i586-linux] -1
添加。
若receiver中不包含指定的索引字符串時,直接返回右邊部分。
foo = "foo" p foo["bar"] = "baz" p foo => ruby 1.6.7 (2002-03-01) [i586-linux] "baz" "foo" => -:2:in `[]=': string not matched (IndexError) from -:2 ruby 1.6.7 (2002-07-30) [i586-linux]
用"%d"把參數變?yōu)檎麛禃r,使用與Integer相同的規(guī)則。
p sprintf("%d", nil) => -:1:in `sprintf': no implicit conversion from nil (TypeError) from -:1 ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.6.7 (2002-07-30) [i586-linux] "0"
以前,為了兼顧那些使用
#! ruby -*- mode: ruby -*-
這種Emacs'-*-'的腳本,而特別規(guī)定:忽略-*以后的部分(將其看作是不進行任何操作的選項),現(xiàn)在已經取消了這種特別設定。若想設定Emacs的'-*-'時,應該寫在第2行。[ruby-dev:17193]
ruby '-*' -v => ruby 1.6.7 (2002-03-01) [i586-linux] => ruby: invalid option -* (-h will show valid options)
版本升級[ruby-dev:17171]
以前,若在ruby的命令行選項-T后不留空格地添加其他選項時,-T后面的選項將被忽略?,F(xiàn)在,-T后面的非數字部分都被看作是選項(與-0選項相同) [ruby-dev:17179]
ruby -Tv # -v が無効 (ruby 1.6.7 (2002-03-01) [i586-linux]) => ruby: No program input from stdin allowed in tainted mode (SecurityError) => ruby 1.6.7 (2002-07-30) [i586-linux]
若對雙向管道dup進行close_write時,則會引發(fā)錯誤。 [ruby-dev:17155]
open("|-","r+") {|f| if f f.dup.close_write else sleep 1 end } => ruby 1.6.7 (2002-03-01) [i586-linux] -:3:in `close_write': closing non-duplex IO for writing (IOError) from -:3 from -:1:in `open' from -:1 => ruby 1.6.7 (2002-07-30) [i586-linux]
# 已經變?yōu)閎ack slash quote。主要是為了能將quote中的正則表達式正確嵌入//x。[ruby-bugs-ja:PR#231]
p Regexp.quote("#") p /a#{Regexp.quote("#")}b/x =~ "ab" => -:3: warning: ambiguous first argument; make sure ruby 1.6.7 (2002-03-01) [i586-linux] "#" 0 => -:3: warning: ambiguous first argument; make sure ruby 1.6.7 (2002-07-30) [i586-linux] "\\#" nil
在$SAFE >= 4的情況下,若沒有指定絕對路徑的話,則會引發(fā)SecurityError異常。
[ruby-bugs-ja:PR#231]
p Regexp.quote("\t") p /a#{Regexp.quote("\t")}b/x =~ "ab" => -:3: warning: ambiguous first argument; make sure ruby 1.6.7 (2002-03-01) [i586-linux] "\t" 0 => -:3: warning: ambiguous first argument; make sure ruby 1.6.7 (2002-05-04) [i586-linux] "\\t" nil
帶/x標識的正則表達式對象的inspect把換行變成了\n。[ruby-bugs-ja:PR#225]
p /a b/x => -:1: warning: ambiguous first argument; make sure ruby 1.6.7 (2002-03-01) [i586-linux] /a\n b/x => -:1: warning: ambiguous first argument; make sure ruby 1.7.2 (2002-04-24) [i586-linux] /a b/x
以前在下列腳本中,需要發(fā)送2次信號才能結束?,F(xiàn)在該問題已解決。[ruby-bugs-ja:PR#223]
trap(:TERM, "EXIT") END{ puts "exit" } Thread::start{ Thread::stop } sleep
[ruby-bugs-ja:PR#222]
p %r{\/} => ruby 1.6.7 (2002-03-01) [i586-linux] /\\// => ruby 1.6.7 (2002-05-04) [i586-linux] /\//
已經修復了無法使用unpack('U')來還原pack('U')的bug。(unpack按照字符單位進行處理,而并非以前的字節(jié)單位) [ruby-bugs-ja:PR#220]
p [128].pack("U") p [128].pack("U").unpack("U") => ruby 1.6.7 (2002-03-01) [i586-linux] "\302\200" [0] => ruby 1.6.7 (2002-05-04) [i586-linux] "\302\200" [128]
檢測socket或管道中的EPIPE時,有時會出現(xiàn)失敗的情況。[ruby-dev:16849]
support for multipart form.
若指定的實例變量尚未定義時,則引發(fā)NameError異常。[ruby-bugs-ja:PR#216]
Object.new.instance_eval { p remove_instance_variable :@foo } => ruby 1.6.7 (2002-03-01) [i586-linux] nil => -:2:in `remove_instance_variable': instance variable @foo not defined (NameError) ruby 1.6.7 (2002-04-10) [i586-linux]
以前,若將第二參數設為小于1的數時,它會被看作為0,進而引發(fā)錯誤。
1.step(2, 0.1) {|f| p f } => -:1:in `step': step cannot be 0 (ArgumentError) from -:1 ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.6.7 (2002-04-10) [i586-linux] 1 1.1 : 1.9
修復了無法將nil賦值給$~的bug。[ruby-dev:16697]
/foo/ =~ "foo" p $~ $~ = nil p $~ => ruby 1.6.7 (2002-03-01) [i586-linux] #<MatchData:0x401b1be4> -:3: wrong argument type nil (expected Match) (TypeError) ^^^^^ MatchData的錯誤 => ruby 1.6.7 (2002-04-04) [i586-linux] #<MatchData:0x401b1c98> nil
在$SAFE > 3的情況下,無法設定值。[ruby-dev:16554]
修復了File#read等無法讀取大小為0的有內容文件(在Linux的/proc文件系統(tǒng)中會發(fā)生這種情況)的bug。
p File.open("/proc/#$$/cmdline").read => ruby 1.6.7 (2002-03-01) [i586-linux] "" => ruby 1.6.7 (2002-03-29) [i586-linux] "ruby-1.6\000-v\000-"
在module_eval的塊中,常數和類變量的作用域不再變化。[ruby-dev:17876]
class Foo FOO = 1 @@foo = 1 end FOO = 2 @@foo = 2 Foo.module_eval { p FOO, @@foo } => ruby 1.6.7 (2002-03-01) [i586-linux] 1 1 => ruby 1.6.7 (2002-03-29) [i586-linux] 2 2
以前,Net::HTTP.new在不帶塊的時候返回nil。 [ruby-bugs-ja:PR#214]
一般認為會逐漸取消net/protocol.rb,該bug好像是在調試時不小心種下的。
有時會出現(xiàn)內存釋放不徹底的情況。[ruby-bugs:PR#276]
在#{..}等結構中,有時會出現(xiàn)漢字代碼處理不全的現(xiàn)象。[ruby-list:34478]
#! ruby -Ks p a = "#{"表"}" => -:1: compile error in string expansion (SyntaxError) -:1: unterminated string meets end of file ruby 1.6.7 (2002-03-15) [i586-linux] => ruby 1.6.7 (2002-03-19) [i586-linux] "表" #! ruby -Ks p %[評價] => -:2: parse error p %[評價] ^ ruby 1.6.7 (2002-03-15) [i586-linux] => ruby 1.6.7 (2002-03-19) [i586-linux] "評價"
以前,若正則表達式方法沒有在內部進行匹配操作時,將不會清除$~ 的狀態(tài)。[ruby-bugs-ja:PR#208]
/foo/ =~ "foo" /foo/ =~ nil p $~ /foo/ =~ "foo" $_ = nil; ~"foo" p $~ /foo/ =~ "foo" "foo".index(/bar/, 4) p $~ /foo/ =~ "foo" "foo".rindex(/bar/, -4) p $~ => ruby 1.6.7 (2002-03-06) [i586-linux] #<MatchData:0x401b1be4> #<MatchData:0x401b198c> #<MatchData:0x401b1644> #<MatchData:0x401b1414> => ruby 1.6.7 (2002-03-19) [i586-linux] nil nil nil nil
無法對擴展庫進行autoload。[ruby-dev:16379]
autoload :Fcntl, "fcntl" require "fcntl" => -:2:in `require': uninitialized constant Fcntl (NameError) from -:2 ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.6.7 (2002-03-15) [i586-linux]
refine. [ruby-dev:16193], [ruby-dev:16213]
以前,在正則表達式中的\nnn形式的8進制表示法中,只有開頭是0時,才允許4位數。[ruby-bugs-ja:PR#207]
p /\0001/ =~ "\0001" # equivalent to "\0" + "1" => -:1: warning: ambiguous first argument; make sure ruby 1.6.7 (2002-03-01) [i586-linux] nil => -:1: warning: ambiguous first argument; make sure ruby 1.6.7 (2002-03-15) [i586-linux] 0
[ruby-bugs-ja:PR#206]
trap('EXIT','Foo') => -:1: [BUG] Segmentation fault ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.6.7 (2002-03-15) [i586-linux]
下列方法的返回值已被修正。[ruby-bugs-ja:PR#205]
[ruby-talk:35122]
class C class << self def test @@cv = 5 p @@cv end end test end => -:5:in `test': uninitialized class variable @@cv in C (NameError) from -:9 ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.6.6 (2001-12-26) [i586-linux] 5
以前,Marshal.load一直調用1.7的Proc#yield方法。[ruby-dev:16178]
Marshal.load(Marshal.dump('foo'), proc {|o| p o}) => -:1:in `load': undefined method `yield' for #<Proc:0x401b1b30> (NameError) from -:1 ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.6.6 (2001-12-26) [i586-linux] "foo"
可以通過定義特殊類的方法來為這些偽變量定義特殊方法。
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.6.7 (2002-03-01) [i586-linux] "foo"
已添加。
修復bug,增加功能[ruby-dev:16139],[ruby-dev:16153]。
重新制定`_'的使用規(guī)則,統(tǒng)一了String#hex等數值變換方法的行為規(guī)則。[rubyist:1018], [ruby-dev:15684], [ruby-dev:15757]
不會遞歸地對模塊進行include操作。
module Foo; end module Bar; include Foo; end module Foo; include Bar; end p Foo.ancestors => ruby 1.6.6 (2001-12-26) [i586-linux] [Foo, Bar, Foo] => -:3:in `append_features': cyclic include detected (ArgumentError) from -:3:in `include' from -:3 ruby 1.6.6 (2002-01-28) [i586-linux]
修正了下列方法的返回值。 [ruby-bugs-ja:PR#182], [rubyist:1016]
以前,若C函數 rb_define_module_under()定義模塊時遇到了已定義的同名常數的話就會失敗。[ruby-talk:30203]
Constants = 1 require 'syslog' p Syslog::Constants => -:2:in `require': Syslog::Fixnum is not a module (TypeError) from -:2 ruby 1.6.6 (2001-12-26) [i586-linux] => ruby 1.6.6 (2002-01-07) [i586-linux] Syslog::Constants
因為這個bug的問題,可能最近就會放出1.6.7[ruby-talk:30387](好像不是這樣。因此使用1.6.6的stable-snapshot的用戶需要特別注意。因為2002/1/30的下列變更(ChangeLog)
的原因,將導致內存不足。2002/2/13以后的修正版解決了這個問題)。
已添加。
針對Netscape(版本是?)的bug進行了處理 [ruby-list:32089]
可以調用一次已凍結的Time 對象。
t = Time.new.freeze p t.gmtime p t.localtime => -:2:in `gmtime': can't modify frozen Time (TypeError) from -:2 ruby 1.6.5 (2001-09-19) [i586-linux] => ruby 1.6.5 (2001-11-01) [i586-linux] Mon Nov 05 18:08:34 UTC 2001 -:3:in `localtime': can't modify frozen Time (TypeError) from -:3
上述各項已變?yōu)楸籪reeze的字符串。
p File::SEPARATOR.frozen? p File::ALT_SEPARATOR.frozen? p File::PATH_SEPARATOR.frozen? => ruby 1.6.5 (2001-09-19) [i586-linux] false false false => ruby 1.6.5 (2001-11-01) [i586-linux] true false # 因為運行環(huán)境是Linux,所以ALT_SEPARATOR是nil true
以前,若遇到大索引值就會引發(fā)異常。 [ruby-bugs-ja:PR#114]
p(-1[10000000000]) => -:1:in `[]': bignum too big to convert into `int' (RangeError) from -:1 ruby 1.6.5 (2001-09-19) [i586-linux] => ruby 1.6.5 (2001-11-01) [i586-linux] 1
不能對整數的負索引返回0。?[ruby-bugs-ja:PR#122]
p(-1[-1]) => ruby 1.6.5 (2001-09-19) [i586-linux] 1 => ruby 1.6.5 (2001-11-01) [i586-linux] 1
[ruby-bugs-ja:PR#110]
p( 3.remainder(-3)) p(-3.remainder(3)) => ruby 1.6.5 (2001-09-19) [i586-linux] 3 -3 => ruby 1.6.5 (2001-11-01) [i586-linux] 0 0
以前,不能運行END塊中的END塊。 [ruby-bugs-ja:PR#107]
END { p 1 END { p 2 } } => ruby 1.6.5 (2001-09-19) [i586-linux] 1 => ruby 1.6.5 (2001-11-01) [i586-linux] 1 2
[ruby-talk:22557]
p "***".succ p "*".succ p sprintf("%c", 255).succ p sprintf("*%c", 255).succ p sprintf("**%c", 255).succ => ruby 1.6.5 (2001-09-19) [i586-linux] "**+" "\001+" "\001\000" "\001+\000" "*+\000" => ruby 1.6.5 (2001-11-01) [i586-linux] "**+" "+" "\001\000" "+\000" "*+\000"
以前,下列內容被Segmentation Fault。[ruby-dev:14942]
Module::constants.each {|c| c = eval c if c.instance_of?(Class) p c c.instance_methods.each {|m| c.module_eval "undef #{m};" } c.module_eval {undef initialize} end } => ruby 1.6.5 (2001-09-19) [i586-linux] NotImplementedError MatchData Exception Numeric MatchData Segmentation fault => ruby 1.6.5 (2001-10-15) [i586-linux] MatchData NotImplementedError FloatDomainError LoadError Float Binding SignalException Module -:6:in `method_missing': stack level too deep (SystemStackError)
在使用%表示法的字面值中,不能將英文字母和數字用作切分字符。
p %q1..1
=> ruby 1.6.5 (2001-10-10) [i586-linux] ".." => -:1: unknown type of %string p %q1..1 ^ ruby 1.6.5 (2001-10-15) [i586-linux]
調用String#=~時,若兩邊都是字面值的話,為了提升速度而禁止進行方法調用。(實際上,此前就曾考慮過這么做,但因為出現(xiàn)了bug而未能禁止方法調用(不是String#=~,而是Regexp#=~))
class String def =~(arg) ["String#=~", self, arg] end end class Regexp def =~(arg) ["Regexp#=~", self, arg] end end p "foo" =~ /foo/ p "foo" =~ Regexp.new("foo") => -:2: warning: discarding old =~ -:8: warning: discarding old =~ ruby 1.6.5 (2001-09-19) [i586-linux] ["Regexp#=~", /foo/, "foo"] ["String#=~", "foo", /foo/] => -:2: warning: discarding old =~ -:8: warning: discarding old =~ ruby 1.6.5 (2001-10-10) [i586-linux] 0 ["String#=~", "foo", /foo/]
(有時會對內部方法進行這種最優(yōu)化設置,因此可能導致重定義方法無效的情況,而確切地說,您應該先判斷某方法是否已被重定義,然后再選擇是否進行最優(yōu)化)
以前,若顯式地使用一個不同的超類來重定義某個已定義的類時,則會忽略指定的超類。[ruby-bugs-ja:PR#87]
class A p self.id end class A < String p self.id p self.superclass end => ruby 1.6.5 (2001-09-19) [i586-linux] 537760880 -:4: warning: already initialized constant A 537757180 Object => ruby 1.6.5 (2001-10-10) [i586-linux] 537760960 -:4: warning: already initialized constant A 537757200 String
以前,語法解釋器會將數組字面值 %w(...)誤判為字符串字面值,從而導致下列異常情況。[ruby-bugs-ja:PR#91]
%w!a! "b" => -:1: tried to allocate too big memory (NoMemoryError) ruby 1.6.5 (2001-09-19) [i586-linux] => -:1: parse error %w!a! "b" ^ ruby 1.6.5 (2001-10-10) [i586-linux]
以前存在下列bug:Thread#status對aborting狀態(tài)返回"run",而Thread#priority = val會返回self而不是val?,F(xiàn)已解決這些問題。[rubyist:0820], [ruby-dev:14903]
不能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 0lx401ab980> (ArgumentError) from -:1 ruby 1.6.5 (2001-10-05) [i586-linux]
以前,UNIXSocket#addr會返回一些垃圾信息(在BSD中如何呢?)。 [ruby-bugs-ja:PR#85]
# server require 'socket' File.unlink("/tmp/sss") sock = UNIXServer.new("/tmp/sss").accept # client require 'socket' sock = UNIXSocket.new("/tmp/sss").addr => ["AF_UNIX", "\031((\306\031(\010"] => ["AF_UNIX", ""]
[ruby-talk:21722]
class Ptr
def initialize(obj) @obj = obj end def []=() @obj = obj end def []() @obj end
end module Kernel
def _ptr() Ptr.new(self) end
end
def foo(int)
int[] += 1
end x = 1._ptr foo(x) puts x[]
=> -:11: [BUG] Segmentation fault
ruby 1.6.5 (2001-09-19) [i586-linux]
=> -:11:in `[]=': wrong # of arguments(1 for 0) (ArgumentError)
from -:11:in `foo' from -:14
ruby 1.6.5 (2001-10-05) [i586-linux]
以前,在String, Array的子類中調用某些特定方法時,就會變成String, Array。
class Foo < String end p Foo.new("").type p Foo.new("foo")[0,0].type # String ??? p Foo.new("foo")[1,1].type p Foo.new("foo").succ.type p Foo.new("foo").reverse.type p((Foo.new("foo") * 5).type) p Foo.new("foo").gsub(/foo/, "bar").type p Foo.new("foo").sub(/foo/, "bar").type p Foo.new("foo").ljust(10).type p Foo.new("foo").rjust(10).type p Foo.new("foo").center(10).type => ruby 1.6.5 (2001-09-19) [i586-linux] Foo String String String String String String Foo String String String => ruby 1.6.5 (2001-10-05) [i586-linux] Foo String Foo Foo Foo Foo Foo Foo Foo Foo Foo class Bar < Array end bar = Bar.new p bar.type p bar.push(1,2,3) p bar.type p bar[0,0].type # => Array ??? p bar[0,1].type p ((bar * 5).type) => -:9: warning: p (...) interpreted as method call ruby 1.6.5 (2001-09-19) [i586-linux] Bar [1, 2, 3] Bar Array Array Array => -:9: warning: p (...) interpreted as method call ruby 1.6.5 (2001-10-05) [i586-linux] Bar [1, 2, 3] Bar Array Bar Bar
以前,在函數中使用Thread#run時,與該線程共享scope的父線程中的$_, $~會被子線程所覆蓋。[ruby-dev:14743]
def foo(t) t.run end t = Thread.start do t = $_= "sub" loop{Thread.stop;puts "sub:#$_"} end $_ = "main" t.run # => sub:sub puts "main:#$_" # => main:main foo(t) # => sub:sub puts "main:#$_" # => main:sub => ruby 1.6.4 (2001-06-04) [i586-linux] sub:sub main:main sub:sub main:sub => ruby 1.6.5 (2001-09-19) [i586-linux] sub:sub main:main sub:sub main:main
有時,當Net::Telnet連接到特定的端口之后,就失去反應。 [ruby-list:31303]
以前,在下述腳本中,TEXT_PLAIN會被改寫成"text/plain; charset=iso-8859-1"。 [ruby-dev:14716]
require 'cgi' TEXT_PLAIN = "text/plain" cgi = CGI.new print cgi.header("type" => TEXT_PLAIN, "charset" => "iso-8859-1") printf("TEXT_PLAIN: %s\n", TEXT_PLAIN) => ruby 1.6.4 (2001-06-04) [i586-linux] Content-Type: text/plain; charset=iso-8859-1 ^M TEXT_PLAIN: text/plain; charset=iso-8859-1 TEXT_PLAIN: text/plain => ruby 1.6.5 (2001-09-19) [i586-linux] Content-Type: text/plain; charset=iso-8859-1 ^M TEXT_PLAIN: text/plain
在尚未定義HOME或LOGDIR時,若不帶參數地調用Dir.chdir的話,就會引發(fā)ArgumentError異常
ENV['HOME'] = nil ENV['LOGDIR'] = nil Dir.chdir => -:3:in `chdir': Bad address (Errno::EFAULT)
from -:3
ruby 1.6.4 (2001-08-26) [i586-linux]
=> -:3:in `chdir': HOME/LOGDIR not set (ArgumentError)
from -:3
ruby 1.6.5 (2001-09-19) [i586-linux]
以前,下列代碼會引起死循環(huán)。
Dir.mkdir("test?") rescue nil p Dir.glob("test?/*") => ruby 1.6.5 (2001-09-19) [i586-linux] []
修改了若干bug。[ruby-list:31238]
Dir.glob("*/**/*")會重復返回子目錄中的文件。 [ruby-dev:14576]
Dir.mkdir('foo') rescue nil Dir.mkdir('foo/bar') rescue nil p Dir.glob('*/**/*') => ruby 1.6.4 (2001-06-04) [i586-linux] ["foo/bar", "foo/bar"] => ruby 1.6.4 (2001-08-26) [i586-linux] ["foo/bar"]
無法bind模塊的UnboundMethod對象。 [rubyist:0728]
module Foo def foo :foo end end class Bar include Foo end m = Foo.instance_method :foo p m.bind(Bar.new).call => ruby 1.6.4 (2001-06-04) [i586-linux] -:12:in `bind': first argument must be an instance of Foo (TypeError) from -:12 => ruby 1.6.4 (2001-08-23) [i586-linux] :foo
對內部類/模塊進行賦值時,會出現(xiàn)警告。
Array = nil p Array => ruby 1.6.4 (2001-06-04) [i586-linux] nil => -:1: warning: already initialized constant Array ruby 1.6.4 (2001-08-23) [i586-linux] nil
以前,若反向參考中的數字大于括號數量時,則會匹配任何內容。[ruby-list:30975]
p /(foo)\2/ =~ "foobar" => ruby 1.6.4 (2001-06-04) [i586-linux] 0 => ruby 1.6.4 (2001-08-23) [i586-linux] nil
修復了Cygwin中TCPSocket.open 時常出錯(Errno::EINVAL, EALREADY)的問題。(1.6.4 20010712以后) [ruby-talk:9939], [ruby-talk:16632], [ruby-list:24702], [ruby-list:27805], [ruby-list:30512] 等等
添加。主要是為了在ruby的resolver(DNS解析)和Socket相關的類中使用該庫而設立。
在ruby的resovler中,timeout.rb的控制是有效的(即,在域名解析過程中可以進行Thread的切換)
require 'resolv' p Resolv.new.getaddress("www.ruby-lang.org").to_s => /usr/local/lib/ruby/1.6/resolv.rb:160: warning: timeout (...) interpreted as method call /usr/local/lib/ruby/1.6/resolv.rb:55: warning: instance variable @initialized not initialized /usr/local/lib/ruby/1.6/resolv.rb:113: warning: instance variable @initialized not initialized /usr/local/lib/ruby/1.6/resolv.rb:392: warning: instance variable @initialized not initialized ruby 1.6.4 (2001-08-23) [i586-linux] "210.251.121.214"
SHA1, MD5被替換成Digest::SHA1, Digest::MD5。 另外,還新增了Digest::SHA256, Digest::SHA384, Digest::SHA512, Digest::RMD160。
require 'digest/md5' include Digest md = MD5.new md << "abc" puts md puts MD5.hexdigest("123")
以前,可以修改已被凍結的結構體對象。另外,當$SAFE = 4時,則禁止進行修改操作。[ruby-talk:19167]
cat = Struct.new("Cat", :name, :age, :life) a = cat.new("cat", 12, 7).freeze a.name = "dog" p a => ruby 1.6.4 (2001-06-04) [i586-linux] #<Struct::Cat name="dog", age=12, life=7> => ruby 1.6.4 (2001-08-06) [i586-linux] -:4:in `name=': can't modify frozen Struct (TypeError) from -:4 cat = Struct.new("Cat", :name, :age, :life) a = cat.new("cat", 12, 7) Thread.new do abort_on_exception = true $SAFE = 4 a.life -= 1 end.join p a.life => ruby 1.6.4 (2001-06-04) [i586-linux] 6 => ruby 1.6.4 (2001-08-06) [i586-linux] -:6:in `life=': Insecure: can't modify Struct (SecurityError) from -:3:in `join' from -:3
將正則表達式傳給rindex時,則會出現(xiàn)bug。[ruby-dev:13843] (該bug出現(xiàn)在1.6.4 版本之后)
p "foobar".rindex(/b/) => ruby 1.6.4 (2001-06-04) [i586-linux] 3 => ruby 1.6.4 (2001-06-19) [i386-freebsd5.0] nil => ruby 1.6.4 (2001-08-06) [i586-linux] 3
以前,若把以~開頭的文件名傳給require時必須帶上擴展名,否則無法進行加載。[ruby-dev:13756]
$ echo p __FILE__ > ~/a.rb $ ruby17 -v -r~/a -e0 ruby 1.7.1 (2001-07-03) [i686-linux] 0: No such file to load -- ~/a (LoadError) $ ruby16 -v -r~/a -e0 ruby 1.6.4 (2001-07-02) [i686-linux] 0: No such file to load -- ~/a (LoadError) $ ruby14 -v -r~/a -e0 ruby 1.4.6 (2000-08-16) [i686-linux] "/home/nobu/a.rb"
以前,無法正確傳遞污染。[ruby-dev:13755]
"foo\nbar\n".taint.each_line {|v| p v.tainted?} => ruby 1.6.4 (2001-06-04) [i586-linux] false true => ruby 1.6.4 (2001-08-06) [i586-linux] true true
以前,無法正確傳遞污染。[ruby-dev:13754]
require 'nkf' p NKF.nkf("-j", "a".taint).tainted? => ruby 1.6.4 (2001-06-04) [i586-linux] false => ruby 1.6.4 (2001-08-06) [i586-linux] true
指定了-x[directory]選項的話,有時會出現(xiàn)尚未執(zhí)行腳本就已經結束的情況。[ruby-dev:13752]
向accessor傳遞多余的參數也不會引起錯誤。 [ruby-dev:13748]
class C def initialize @message = 'ok' end attr_reader :message end puts C.new.message(1,2,3) => ruby 1.6.4 (2001-06-04) [i586-linux] ok => ruby 1.6.4 (2001-08-06) [i586-linux] -:7:in `message': wrong # of arguments(3 for 0) (ArgumentError) from -:7
添加。GNU Readline庫中的rl_completion_append_character
變量的accessor。(在GNU readline 2.1之后的版本中才能使用該變量) [ruby-ext:01760]
添加了下列socket相關的常數。
SO_PASSCRED SO_PEERCRED SO_RCVLOWAT SO_SNDLOWAT SO_RCVTIMEO SO_SNDTIMEO SO_SECURITY_AUTHENTICATION SO_SECURITY_ENCRYPTION_TRANSPORT SO_SECURITY_ENCRYPTION_NETWORK SO_BINDTODEVICE SO_ATTACH_FILTER SO_DETACH_FILTER SO_PEERNAME SO_TIMESTAMP
Changed to use a new algorithm to locate a library.
Now when requiring "foo", the following directories are searched for the library in the order listed.
$prefix/lib/ruby/site_ruby/$ver/foo.rb $prefix/lib/ruby/site_ruby/$ver/foo.so $prefix/lib/ruby/site_ruby/$ver/$arch/foo.rb $prefix/lib/ruby/site_ruby/$ver/$arch/foo.so $prefix/lib/ruby/site_ruby/foo.rb $prefix/lib/ruby/site_ruby/foo.so $prefix/lib/ruby/$ver/foo.rb $prefix/lib/ruby/$ver/foo.so $prefix/lib/ruby/$ver/$arch/foo.rb $prefix/lib/ruby/$ver/$arch/foo.so ./foo.rb ./foo.so
The previous behavior had a potential security risk because a foo.rb (if exists) in the current directory is located prior to a foo.so in $prefix/lib/ruby/site_ruby/$ver/$arch.
[ruby-bugs:PR#140], [ruby-ext:01778], [ruby-dev:13659]
Fixed for obj.extend(Sync_m) and obj.extend(Mutex_m).[ruby-dev:13463]
$ ruby -v -rsocket -rmutex_m -e 's=TCPSocket.new("localhost",25); s.extend(Mutex_m)' ruby 1.6.4 (2001-06-04) [i386-linux] /usr/lib/ruby/1.6/mutex_m.rb:104:in `initialize': wrong # of arguments (0 for 1) (ArgumentError) from /usr/lib/ruby/1.6/mutex_m.rb:104:in `initialize' from /usr/lib/ruby/1.6/mutex_m.rb:50:in `mu_extended' from /usr/lib/ruby/1.6/mutex_m.rb:34:in `extend_object' from -e:1:in `extend' from -e:1
以前存在以下bug:在1 <= $SAFE <= 3的情況下,當第二參數為true時,即使指定了被污染的對象名,也能進行l(wèi)oad()?,F(xiàn)在已經修復該bug。[ruby-dev:13481]
$SAFE = 1 filename = "foo" filename.taint p load(filename, true) => ruby 1.6.4 (2001-06-04) [i586-linux] true => ruby 1.6.4 (2001-08-06) [i586-linux] -:4:in `load': Insecure operation - load (SecurityError) from -:4
以前,只有后者能匹配成功。[ruby-talk:16233]
puts "OK 1" if /(.|a)bd/ =~ "cxbd" puts "OK 2" if /(a|.)bd/ =~ "cxbd" => ruby 1.6.4 (2001-06-04) [i586-linux] OK 2 => ruby 1.6.4 (2001-08-06) [i586-linux] OK 1 OK 2
以前,模塊加載時的類型檢測中存在錯誤。修復該錯誤后,dump format的minor版本號升高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"
雖然doc/NEWS中有下列內容
Fixed so defining a new method is allowed under $SAFE == 4, which previously wasn't.
但實際上是行不通的。
$SAFE = 4; def a; end => -:1: Insecure operation `(null)' at level 4 (SecurityError) ruby 1.6.4 (2001-06-04) [i586-linux] => -:1: Insecure: can't define method (SecurityError) ruby 1.6.4 (2001-08-06) [i586-linux]
對應的ChangeLog內容如下。
Tue Jun 5 15:16:06 2001 Yukihiro Matsumoto <matz@ruby-lang.org> * eval.c (rb_add_method): should not call rb_secure(), for last_func may not be set.
差別如下所示。
@@ -227,10 +227,7 @@ rb_add_method(klass, mid, node, noex) NODE *body; if (NIL_P(klass)) klass = rb_cObject; - if (klass == rb_cObject) { - rb_secure(4); - } - if (rb_safe_level() >= 4 && !OBJ_TAINTED(klass)) { + if (rb_safe_level() >= 4 && (klass == rb_cObject || !OBJ_TAINTED(klass))) { rb_raise(rb_eSecurityError, "Insecure: can't define method"); } if (OBJ_FROZEN(klass)) rb_error_frozen("class/module");
留作日后調查。
第2參數也可以接受Bignum了(為了覆蓋long int的范圍)
以前,在哈希表迭代過程中,若刪除某元素后,向其他哈希表中進行replace時,就會Abort。[ruby-dev:13432]
h = { 10 => 100, 20 => 200 } h2 = { } h.each { |k, v| if (k == 10) h.delete(10) h2.replace(h) # => Abort core dumped end }
在$SAFE >= 2的環(huán)境中,即使參數未被污染也不能使用File.unlink。[ruby-dev:13426]
touch foo ruby -v -e '$SAFE=2;File.unlink("foo")' => ruby 1.6.3 (2001-03-19) [i586-linux] => ruby 1.6.4 (2001-06-04) [i586-linux] -e:1:in `unlink': Insecure operation `unlink' at level 2 (SecurityError) from -e:1
現(xiàn)在不能對已凍結的對象使用untaint方法。[ruby-dev:13409]
a = Object.new a.taint a.freeze a.untaint => ruby 1.6.3 (2001-03-19) [i586-linux] => ruby 1.6.4 (2001-06-04) [i586-linux] -:4:in `untaint': can't modify frozen object (TypeError) from -:4
指定-T4選項時,因為無法修改ARGV導致程序無法運行。[ruby-dev:13401]
touch foo ruby-1.6.3 -v -T4 foo => ruby 1.6.3 (2001-03-19) [i586-linux] foo: Insecure: can't modify array (SecurityError)
現(xiàn)在,正則表達式中的 \1 .. \9 總是會被解釋為反向參考(以前則不同,若有對應的括號則看作反向參考,若沒有的話則看作8進制字符代碼)。
在正則表達式中指定8進制字符代碼時,請使用形如\001這種3位表示法。
另外,若反向參考中沒有對應的括號,或者對應的括號中包含反向參考本身的話,則會引起匹配失敗。
p /(foo)\2/ =~ "foo\002" => ruby 1.6.3 (2001-03-19) [i586-linux] 0 => ruby 1.6.4 (2001-06-04) [i586-linux] 0 => ruby 1.6.4 (2001-08-23) [i586-linux] nil
(如上所示,1.6.4中仍然有bug。大概是在2001-08-23的時候得到了修正[ruby-list:30975])
p /(foo\1)/ =~ "foo" => ruby 1.6.3 (2001-03-19) [i586-linux] 0 => ruby 1.6.4 (2001-06-04) [i586-linux] nil
下列各項都會返回true。[ruby-dev:13340]
# []= s1 = "abc" s2 = "cde".taint s1[0]= s2 p s1.tainted? # => false # crypt s = "abc".taint p s.crypt("cd").tainted? # => false # ljust s = "abc".taint p s.ljust(10).tainted? # => false # rjust s = "abc".taint p s.rjust(10).tainted? # => false # center s = "abc".taint p s.center(10).tainted? # => false
以前在C API中使用yield時,1個參數會被當作只包含1個元素的數組來處理。[ruby-dev:13299]
class X include Enumerable def each(&block) block.call(1,2) block.call(2,3) block.call(3,4) end end x = X.new p x.to_a #=> [[1], [2], [3]] # => ruby 1.6.3 (2001-03-19) [i586-linux] [[1], [2], [3]] # => ruby 1.6.4 (2001-06-04) [i586-linux] [1, 2, 3]
當$SAFE = 4時,不允許全局變量使用別名。 [ruby-dev:13287]
結束的進程不會調用at_exit。 (將exit修正為exit!) [ruby-dev:13170]
下列代碼不會再導致死鎖了。[ruby-dev:13169]
ruby -r thread -e 'q = SizedQueue.new(1); q.push(1);'\ -e 'Thread.new{sleep 1; q.pop}; q.push(1);'
以前當max大于當前值時,則會喚起相應的等待線程。但在該處理過程中存在錯誤。[ruby-dev:13170]
在調用Thread#run時,若線程忽然死亡則會引發(fā)ThreadError?,F(xiàn)在已經針對這個問題進行了相應的處理。[ruby-dev:13194]
[ruby-dev:13195]
th1 = Thread.start { begin Thread.stop ensure Thread.pass Thread.stop end } sleep 1
(據我所知,在ruby-1.7.0 (2001-05-17) 以后的版本中解決了這個問題,但1.6好像還不行)
以前,結果數組中的元素均被凍結,不能修改。[ruby-list:29665]
(%w(foo bar) & %w(foo baz))[0].upcase! => -:1:in `upcase!': can't modify frozen string (TypeError) %w(foo bar bar baz).uniq[0].upcase! => -:1:in `upcase!': can't modify frozen string (TypeError)
shell.rb 0.6被添加到標準庫中。(文檔在doc目錄中)
forwardable.rb 1.1被添加到標準庫中。(文檔在doc目錄中)
irb和irb-tools分別升級到0.7.4和0.7.1。
對夏令時的考慮不周(?) [ruby-bugs-ja:PR#46]
env TZ=America/Managua ruby -e 'p Time.local(1998,12,1,0,59,59)' => Mon Nov 30 01:59:59 EST 1998 env TZ=America/Managua ruby -e 'p Time.local(1998,12,1,0,59,59).tv_sec' => 912409199
對4.4BSD的SIGINFO信號采取了相應的處理措施。[ruby-bugs-ja:PR#45]
有時會在Thread.stop中發(fā)生SEGV。[ruby-dev:13189]
下列代碼在1.6.3中會引起parse error,現(xiàn)在已經修復了該bug。[ruby-dev:13073], [ruby-dev:13292]
raise "" rescue [] raise "" rescue (p "foo"; true) raise "" rescue -1 raise "" rescue (-1)
下列代碼不會再引起dead lock了。
Thread.start { Thread.stop } sleep => deadlock 0x40199b58: 2:0 - -:1 deadlock 0x401a2528: 2:4 (main) - -:2 -:2:in `sleep': Thread: deadlock (fatal) from -:2 ruby 1.6.3 (2001-03-19) [i586-linux]
以前,這些方法甚至可以訪問常數以外的對象?,F(xiàn)在已經修正了該bug [ruby-dev:13019]
dump Float時精度由"%.12g"提升到了"%.16g"。 [ruby-list:29349]
好像是修正了在sizeof(long) > sizeof(int)這種系統(tǒng)上的bug。
修正了2個較少見的bug [ruby-talk:13658], [ruby-talk:13744]
在1.6.3中,下列代碼不能正常運行[ruby-talk:13957]
def WHILE(cond) return if not cond yield retry end i=0 WHILE(i<3) { print i i+=1 } ruby 1.6.2 (2000-12-25) [i586-linux] => 012 ruby 1.6.3 (2001-03-19) [i586-linux] => 0 ruby 1.6.4 (2001-05-02) [i586-linux] => 012
以前無法正確返回超過1G byte的文件的大小。
File.open("/tmp/1GB", "w") {|f| f.seek(2**30-1, 0) f.puts f.flush p f.stat.size } # => ruby 1.6.3 (2001-04-03) [i586-linux] -1073741824 # => ruby 1.6.4 (2001-04-19) [i586-linux] 1073741824
好像修正了一些問題 [ruby-dev:12718]
以前會莫名其妙地返回異常。
當stdio在內部調用malloc()時,會破壞其與Thread的兼容性,因此采取了一些補救措施。(通過使用setvbuf(),來避免調用malloc()) [ruby-dev:12795]
在File#flock鎖定之后,有時會拋出Errno::EACCES異常,而并不會返回false(這種情況出現(xiàn)在沒有flock()的系統(tǒng)中)
添加 [ruby-dev:12803]
(再次)修正了導致% 計算錯誤的bug
a = 677330545177305025495135714080 b = 14269972710765292560 p a % b #=> 0 p -a % b #=> => ruby 1.6.3 (2001-04-02) [i386-cygwin] 0 14269972710765292560 => ruby 1.6.4 (2001-04-19) [i586-linux] 0 0
將Bignum進行dump -> load操作之后得到的結果往往與原值不同。
在1.6.3版本之后,共進行了3次相關部分的修改。 請使用stable-snapshot的
ruby 1.6.3 (2001-03-22)
之后的版本。
UNC 形式的路徑名 (//host/share)得到了支持。使用斜線(`/
'),而并非反斜線(`\
')。 (其實以前就支持的,難道是修正bug了??)
以前,無法對當前目錄(./)進行glob。
p Dir["./*.c"] => []
以前的版本認定二者的結合度相同,現(xiàn)在修正了這個bug。
在1.6.0到1.6.2之間的版本中,
method v { .. } method v do .. end
兩者之間沒有區(qū)別。正確的描述詳見迭代器部分。
修正了導致 % 計算錯誤的bug
ruby-1.6.2 -ve 'p 6800000000%4000000000' => ruby 1.6.2 (2000-12-25) [i586-linux] -1494967296 ruby-1.6.3 -ve 'p 6800000000%4000000000' => ruby 1.6.3 (2001-03-10) [i586-linux] 2800000000
與通常的方法定義一樣,也可以指定rescue, ensure部分
obj = Object.new def obj.foo rescue ensure end
可以用'\-'來表示'-'(tr! 等、bang method也是一樣的)。以前,只有字符串開頭或末尾的'-'才會被看作是'-'。
p "-".tr("a-z", "+") # => "-" p "-".tr("-az", "+") # => "+" p "-".tr("az-", "+") # => "+" p "-".tr('a\-z', "+") # => "+" # 請注意單引號字符串 p "-".tr("a\\-z", "+") # => "+" # 在""中需要使用二個\
所有選項都相同的話,則被判定為相同。以前,只要漢字代碼選項 和 /i (case-insensitive)相同,就被看作是相同。
可以使用反斜線對字面值的末尾字符(`)'等)進行轉義。
"**/"無法找到符號連接了。
現(xiàn)在"a"[1,2]會返回""。
p "a"[1,2] => ""
這是正確的結果。以前的老版本(1.4.6等)也都是對的。但1.6.0到1.6.2之間的版本則返回nil
。
p "a"[2,1]
返回nil
。
無法對freeze的對象進行taint
操作
obj = Object.new.freeze obj.taint => -:2:in `taint': can't modify frozen object (TypeError) from -:2