国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

direktori cari
Ruby用戶指南 3、開始 4、簡單的例子 5、字符串 6、正則表達式 7、數組 8、回到那些簡單的例子 9、流程控制 10、迭代器 11、面向對象思維 12、方法 13、類 14、繼承 15、重載方法 16、訪問控制 17、單態(tài)方法 18、模塊 19、過程對象 20、變量 21、全局變量 22、實變量 23、局部變量 24、類常量 25、異常處理:rescue 26、異常處理:ensure 27、存取器 28、對象的初始化 29、雜項 RGSS入門教程 1、什么是RGSS 2、開始:最簡單的腳本 3、數據類型:數字 4、數據類型:常量與變量 5、數據類型:字符串 6、控制語句:條件分歧語句 7、控制語句:循環(huán) 8、函數 9、對象與類 10、顯示圖片 11、數組 12、哈希表(關聯(lián)數組) 13、類 14、數據庫 15、游戲對象 16、精靈的管理 17、窗口的管理 18、活動指令 19、場景類 Programming Ruby的翻譯 Programming Ruby: The Pragmatic Programmer's Guide 前言 Roadmap Ruby.new 類,對象和變量 容器Containers,塊Blocks和迭代Iterators 標準類型 深入方法 表達式Expressions 異常,捕捉和拋出(已經開始,by jellen) 模塊 基本輸入輸出 線程和進程 當遭遇挫折 Ruby和它的世界 Ruby和Web開發(fā) Ruby Tk Ruby 和微軟的 Windows 擴展Ruby Ruby語言 (by jellen) 類和對象 (by jellen) Ruby安全 反射Reflection 內建類和方法 標準庫 OO設計 網絡和Web庫 Windows支持 內嵌文檔 交互式Ruby Shell 支持 Ruby參考手冊 Ruby首頁 卷首語 Ruby的啟動 環(huán)境變量 對象 執(zhí)行 結束時的相關處理 線程 安全模型 正則表達式 字句構造 程序 變量和常數 字面值 操作符表達式 控制結構 方法調用 類/方法的定義 內部函數 內部變量 內部常數 內部類/模塊/異常類 附加庫 Ruby變更記錄 ruby 1.6 特性 ruby 1.7 特性 Ruby術語集 Ruby的運行平臺 pack模板字符串 sprintf格式 Marshal格式 Ruby FAQ Ruby的陷阱
watak

ruby 1.6 特性

ruby version 1.6是穩(wěn)定版。在該版本中,主要修改了一些bug。

stable-snapshot是穩(wěn)定版的源代碼,且每日更新。

1.6.8 (2002-12-24) -> stable-snapshot

2003-01-22: errno

在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

1.6.7 (2002-03-01) -> 1.6.8 (2002-12-24)

2002-10-02: Thread (cygwin)

在Cygwin中,有時無法切換Thread。 [ruby-list:36058], [ruby-list:24637]

2002-10-01: Socket (win)

好像解決了一個Windows中的socket問題。(從原來的郵件中無法得到具體的問題描述,但好像是:雖然可以用select來進行讀入,但返回的是空數組) [ruby-talk:40015], [ruby-win32:366]

2002-09-12: Thread.status (?)

有時用trap捕獲信號時卻并沒有保存線程的狀態(tài),導致被信號中斷的線程狀態(tài)混亂[ruby-talk:40337], [ruby-core:00019]

2002-09-11: Queue#pop

Queue#pop中存在競爭問題[ruby-dev:17223]

2002-09-11: SizedQueue.new

修改了可接受0以下的參數的bug。

2002-09-05: 展開式

在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]
SizedQueue#deq, #shift
SizedQueue#enq

添加(push, pop的別名)。以前尚未定義它們時,調用enq等就會執(zhí)行超類Queue的enq。

2002-09-11: Tempfile#size

添加[ruby-dev:17221]

2002-09-09

在mswin32版和mingw32版的ruby中,從1.6.6版起就有一個bug:ruby的子進程無法接收環(huán)境變量。[ruby-dev:18236]

2002-09-03

在使用Bison編譯的Ruby中,多次加載庫的速度有所提高。(若不使用Bison的話,每次加載時,好像都會顯式地執(zhí)行GC,所以運行速度會下降) [ruby-dev:18145]

2002-08-20 File.expand_path

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
2002-08-19 Thread (win)

以前,同時使用Ruby線程和Win32的結構化異常(包括來自Win32 API的callback)的話就會引起故障?,F(xiàn)在該bug已被修復。[ruby-win32:273]

2002-08-12 Hash#==

以前,只要兩個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
2002-07-11 String#slice!

以前,若指定了范圍之外的字符串的話,有時會返回異?!,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
2002-07-05 String#split

現(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"]
2002-06-15 Dir.glob

以前,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"]
2002-06-13 Hash[]

以前,無法用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]
2002-06-10 Fixnum#>>, <<

有時對負數進行右移位時,就會變成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
2002-06-05
Math.acosh
Math.asinh
Math.atanh

添加。

2002-06-03
String#[]=

若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]
2002-06-03 sprintf()

用"%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"
2002-05-23 -* 選項(?)

以前,為了兼顧那些使用

#! 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)
2002-05-22 parsedate

版本升級[ruby-dev:17171]

2002-05-22 -T 選項

以前,若在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]
2002-05-20 IO#close

若對雙向管道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]
2002-05-02 Regexp.quote

# 已經變?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
2002-04-29: rb_find_file()

在$SAFE >= 4的情況下,若沒有指定絕對路徑的話,則會引發(fā)SecurityError異常。

2002-04-26: Regexp.quote

[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
2002-04-20: Regexp#inspect

帶/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
2002-04-19: 結束時的相關處理

以前在下列腳本中,需要發(fā)送2次信號才能結束?,F(xiàn)在該問題已解決。[ruby-bugs-ja:PR#223]

trap(:TERM, "EXIT")

END{
  puts "exit"
}

Thread::start{ Thread::stop }
sleep
2002-04-17: Regexp#inspect

[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]
   /\//
2002-04-15: pack('U')

已經修復了無法使用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]
2002-04-11: IO#write

檢測socket或管道中的EPIPE時,有時會出現(xiàn)失敗的情況。[ruby-dev:16849]

2002-04-11: cgi/session.rb (*文檔中未出現(xiàn)*)

support for multipart form.

2002-04-10: Object#remove_instance_variable

若指定的實例變量尚未定義時,則引發(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]
2002-04-04: Integer#step

以前,若將第二參數設為小于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
2002-04-01: $~

修復了無法將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
2002-03-25 BasicSocket.do_not_reverse_lookup

在$SAFE > 3的情況下,無法設定值。[ruby-dev:16554]

2002-03-23 IO#read

修復了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-"
2002-03-22 module_eval

在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
2002-03-22 net/http.rb

以前,Net::HTTP.new在不帶塊的時候返回nil。 [ruby-bugs-ja:PR#214]

一般認為會逐漸取消net/protocol.rb,該bug好像是在調試時不小心種下的。

2002-03-20 File.expand_path

有時會出現(xiàn)內存釋放不徹底的情況。[ruby-bugs:PR#276]

2002-03-18 字符串字面值

在#{..}等結構中,有時會出現(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]
   "評價"
2002-03-16 $~

以前,若正則表達式方法沒有在內部進行匹配操作時,將不會清除$~ 的狀態(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
2002-03-14 擴展庫的autoload

無法對擴展庫進行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]
2002-03-13 getopts.rb

refine. [ruby-dev:16193], [ruby-dev:16213]

2002-03-11 正則表達式中的8進制代碼

以前,在正則表達式中的\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
2002-03-11 trap

[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]
2002-03-10 方法的返回值

下列方法的返回值已被修正。[ruby-bugs-ja:PR#205]

  • each_with_index返回self(以前是nil)
  • Process.setpgrp返回不定值。
  • ljust, rjust, center返回已dup的字符串
2002-03-08 class variable

[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
2002-03-03 Marshal.load

以前,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"

1.6.6 (2001-12-26) -> 1.6.7 (2002-03-01)

2002-02-20 true/false/nil的特殊方法定義

可以通過定義特殊類的方法來為這些偽變量定義特殊方法。

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"
time.rb, URI

已添加。

Ruby/Tk

修復bug,增加功能[ruby-dev:16139],[ruby-dev:16153]。

數值字面值的`_'

重新制定`_'的使用規(guī)則,統(tǒng)一了String#hex等數值變換方法的行為規(guī)則。[rubyist:1018], [ruby-dev:15684], [ruby-dev:15757]

include

不會遞歸地對模塊進行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]

  • Hash#default= 返回右邊部分(以前返回self)。
  • Dir#pos= 返回右邊部分(以前返回self)。 (Dir#seek仍然返回self)
  • Dir.glob 帶塊時返回nil(以前返回false)
  • IO#close 遇到已關閉的IO則引發(fā)IOError。
  • IO#each_byte 返回self(以前返回nil)
rb_define_module_under()

以前,若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)

  • re.c (rb_reg_search): should set regs.allocated.

的原因,將導致內存不足。2002/2/13以后的修正版解決了這個問題)。

1.6.5 (2001-09-19) -> 1.6.6 (2001-09-19)

Syslog

已添加。

CGI

針對Netscape(版本是?)的bug進行了處理 [ruby-list:32089]

Time#localtime
Time#gmtime

可以調用一次已凍結的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
File::SEPARATOR
File::ALT_SEPARATOR
File::PATH_SEPARATOR
RUBY_PLATFORM
RUBY_RELEASE_DATE
RUBY_VERSION

上述各項已變?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
Integer[nth]

以前,若遇到大索引值就會引發(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
Numeric#remainder

[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塊中的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
String#succ

[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"
method_missing

以前,下列內容被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)
%q(...)

在使用%表示法的字面值中,不能將英文字母和數字用作切分字符。

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#=~

調用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)化)

class 定義

以前,若顯式地使用一個不同的超類來重定義某個已定義的類時,則會忽略指定的超類。[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(...)

以前,語法解釋器會將數組字面值 %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]
Thread

以前存在下列bug:Thread#status對aborting狀態(tài)返回"run",而Thread#priority = val會返回self而不是val?,F(xiàn)已解決這些問題。[rubyist:0820], [ruby-dev:14903]

Marshal

不能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

以前,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]
Subclass of String and Array

以前,在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

1.6.4 (2001-06-04) -> 1.6.5 (2001-09-19)

$_, $~, if a..b

以前,在函數中使用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.rb

有時,當Net::Telnet連接到特定的端口之后,就失去反應。 [ruby-list:31303]

CGI#header

以前,在下述腳本中,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
Dir.chdir

在尚未定義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]
Dir.glob

以前,下列代碼會引起死循環(huán)。

Dir.mkdir("test?") rescue nil
p Dir.glob("test?/*")
=> ruby 1.6.5 (2001-09-19) [i586-linux]
   []
jcode.rb

修改了若干bug。[ruby-list:31238]

Dir.glob

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"]
UnboundMethod#bind

無法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
Regexp

以前,若反向參考中的數字大于括號數量時,則會匹配任何內容。[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
TCPSocket.open

修復了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] 等等

lib/resolv.rb, lib/resolv-replace.rb

添加。主要是為了在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"
Digest 模塊

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")
Struct

以前,可以修改已被凍結的結構體對象。另外,當$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
String#rindex

將正則表達式傳給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

以前,若把以~開頭的文件名傳給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"
String#each_line

以前,無法正確傳遞污染。[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
NKF::nkf

以前,無法正確傳遞污染。[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
ruby -x

指定了-x[directory]選項的話,有時會出現(xiàn)尚未執(zhí)行腳本就已經結束的情況。[ruby-dev:13752]

attr_*

向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
Readline::completion_append_character
Readline::completion_append_character=

添加。GNU Readline庫中的rl_completion_append_character變量的accessor。(在GNU readline 2.1之后的版本中才能使用該變量) [ruby-ext:01760]

Socket::Constants

添加了下列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
require / $LOAD_PATH

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]

lib/sync.rb
lib/mutex_m.rb

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
$SAFE / load

以前存在以下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
Regexp

以前,只有后者能匹配成功。[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
Marshal

以前,模塊加載時的類型檢測中存在錯誤。修復該錯誤后,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"
$SAFE / def

雖然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");

留作日后調查。

IO#ioctl

第2參數也可以接受Bignum了(為了覆蓋long int的范圍)

1.6.3 (2001-03-19) -> 1.6.4 (2001-06-04)

Hash#replace

以前,在哈希表迭代過程中,若刪除某元素后,向其他哈希表中進行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 / File::unlink

在$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
Object#untaint

現(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
ruby -T4

指定-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)
Regexp

現(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
rb_yield_0()

以前在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 / alias

當$SAFE = 4時,不允許全局變量使用別名。 [ruby-dev:13287]

Open3::popen3

結束的進程不會調用at_exit。 (將exit修正為exit!) [ruby-dev:13170]

SizedQueue#pop

下列代碼不會再導致死鎖了。[ruby-dev:13169]

ruby -r thread -e 'q = SizedQueue.new(1); q.push(1);'\
               -e 'Thread.new{sleep 1; q.pop}; q.push(1);'
SizedQueue#max=

以前當max大于當前值時,則會喚起相應的等待線程。但在該處理過程中存在錯誤。[ruby-dev:13170]

Queue
SizedQueue

在調用Thread#run時,若線程忽然死亡則會引發(fā)ThreadError?,F(xiàn)在已經針對這個問題進行了相應的處理。[ruby-dev:13194]

Ctrl-C (Interrupt)失效

[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好像還不行)

Array#&
Array#|
Array#uniq

以前,結果數組中的元素均被凍結,不能修改。[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

shell.rb 0.6被添加到標準庫中。(文檔在doc目錄中)

forwardable.rb

forwardable.rb 1.1被添加到標準庫中。(文檔在doc目錄中)

irb.rb & irb-tools

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
SIGINFO

對4.4BSD的SIGINFO信號采取了相應的處理措施。[ruby-bugs-ja:PR#45]

Thread.stop中的SEGV

有時會在Thread.stop中發(fā)生SEGV。[ruby-dev:13189]

rescue 修飾部分

下列代碼在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)
Thread

下列代碼不會再引起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]
Module#const_defined?
Module#const_get
Module#const_set

以前,這些方法甚至可以訪問常數以外的對象?,F(xiàn)在已經修正了該bug [ruby-dev:13019]

Marshal.dump

dump Float時精度由"%.12g"提升到了"%.16g"。 [ruby-list:29349]

Fixnum#[]

好像是修正了在sizeof(long) > sizeof(int)這種系統(tǒng)上的bug。

正則表達式

修正了2個較少見的bug [ruby-talk:13658], [ruby-talk:13744]

retry

在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
File::Stat#size

以前無法正確返回超過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
Float#modulo, Float#divmod

好像修正了一些問題 [ruby-dev:12718]

ObjectSpace#_id2ref

以前會莫名其妙地返回異常。

malloc的遞歸調用問題

當stdio在內部調用malloc()時,會破壞其與Thread的兼容性,因此采取了一些補救措施。(通過使用setvbuf(),來避免調用malloc()) [ruby-dev:12795]

File#flock

在File#flock鎖定之后,有時會拋出Errno::EACCES異常,而并不會返回false(這種情況出現(xiàn)在沒有flock()的系統(tǒng)中)

File::Stat.new(filename)

添加 [ruby-dev:12803]

Bignum#%的計算錯誤

(再次)修正了導致% 計算錯誤的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
Marshal

將Bignum進行dump -> load操作之后得到的結果往往與原值不同。

在1.6.3版本之后,共進行了3次相關部分的修改。 請使用stable-snapshot的

ruby 1.6.3 (2001-03-22)

之后的版本。

Universal Naming Convention(UNC) 的支持(win32)

UNC 形式的路徑名 (//host/share)得到了支持。使用斜線(`/'),而并非反斜線(`\')。 (其實以前就支持的,難道是修正bug了??)

Dir.glob (win32)

以前,無法對當前目錄(./)進行glob。

p Dir["./*.c"]
=> []

1.6.2 -> 1.6.3 (2001-03-19)

do .. end 和 { .. }

以前的版本認定二者的結合度相同,現(xiàn)在修正了這個bug。

在1.6.0到1.6.2之間的版本中,

method v { .. }
method v do .. end

兩者之間沒有區(qū)別。正確的描述詳見迭代器部分。

Bignum#% 的計算錯誤

修正了導致 % 計算錯誤的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
String#count
String#delete
String#squeeze
String#tr_s

可以用'\-'來表示'-'(tr! 等、bang method也是一樣的)。以前,只有字符串開頭或末尾的'-'才會被看作是'-'。

p "-".tr("a-z",  "+")  # => "-"
p "-".tr("-az",  "+")  # => "+"
p "-".tr("az-",  "+")  # => "+"
p "-".tr('a\-z', "+")  # => "+" # 請注意單引號字符串
p "-".tr("a\\-z", "+") # => "+" # 在""中需要使用二個\
Regexp#==

所有選項都相同的話,則被判定為相同。以前,只要漢字代碼選項 和 /i (case-insensitive)相同,就被看作是相同。

%q(), %w()

可以使用反斜線對字面值的末尾字符(`)'等)進行轉義。

Dir.glob

"**/"無法找到符號連接了。

String#[]

現(xiàn)在"a"[1,2]會返回""。

p "a"[1,2]
=> ""

這是正確的結果。以前的老版本(1.4.6等)也都是對的。但1.6.0到1.6.2之間的版本則返回nil。

p "a"[2,1]返回nil。

Object#taint

無法對freeze的對象進行taint操作

obj = Object.new.freeze
obj.taint
=> -:2:in `taint': can't modify frozen object (TypeError)
           from -:2

Artikel sebelumnya: Artikel seterusnya: