©
本文档使用 PHP中文网手册 发布
ruby version 1.7是开发版。将来可能会删除下列中的部分内容,也可能因为兼容性问题而对其进行修改。
新增。作为profile.rb的实体将其分离出来。
新增。用在allocate方法的定义中。 [ruby-dev:19116]
返回布尔值。
p(/foo/ === "foo") => ruby 1.6.8 (2002-12-24) [i586-linux] 0 => ruby 1.8.0 (2003-03-12) [i586-linux] true
遇到对属性赋值或对数组元素进行赋值的情况时,返回"assignment"而非"method"。
class Foo attr_accessor :foo end p defined? Foo.new.foo = 1 ary = [] p defined? ary[2] = 1 => ruby 1.6.8 (2002-12-24) [i586-linux] "method" "method" => ruby 1.8.0 (2003-03-12) [i586-linux] "assignment" "assignment"
新增
加入了WindowsCE的支持补丁。
向IO#read, IO#sysread新增了第二参数(指定了预先分配好的读入缓冲)
新增。与Thread#kill 相同。
新增。与abort, exit函数相同。
新增
改名了,原名为become。(此后,在1.8中又改名为initialize_copy)
增加了参数。
ruby -e 'raise SystemExit.new(2)' echo $? # => 2
新增
p [[1,2,3], [4,5,6], [7,8,9]].transpose => ruby 1.7.3 (2002-12-11) [i586-linux] [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
试验性的修改。
a = 1 p a / 5 => ruby 1.6.8 (2002-12-24) [i586-linux] 0 => ruby 1.8.0 (2003-03-12) [i586-linux] 0 a = 1 p a /5 => -:2: warning: ambiguous first argument; make sure -:2: unterminated regexp meets end of file ruby 1.6.8 (2002-12-24) [i586-linux] => ruby 1.8.0 (2003-03-12) [i586-linux] 0
新增 (Object#id是obsolete)
p Object.new.id => ruby 1.6.7 (2002-03-01) [i586-linux] 537730140 => -:1: warning: Object#id will be deprecated; use Object#object_id ruby 1.7.3 (2002-12-04) [i586-linux] 537723790
新增(取消了Symbol#intern)
新增
p [1,2,3].zip([4,5,6], [7,8,9]) => ruby 1.7.3 (2002-12-11) [i586-linux] [[1, 4, 7], [2, 5, 8], [3, 6, 9]] p [1,2,3].zip([4,5,6], [7,8,9]) {|v| p v} => ruby 1.7.3 (2002-12-11) [i586-linux] [1, 4, 7] [2, 5, 8] [3, 6, 9] nil
[ruby-dev:18606]
增加了Module#private_method_defined?,Module#protected_method_defined?,Module#public_method_defined?
修改了Object#methods, Module#instance_methods(为了与 Module#method_defined?和Module#instance_methods的关系 取得一致)
class Foo def public_m; end private def private_m; end protected def protected_m; end end foo = Foo.new m = %w(public_m private_m protected_m) p m.collect {|_| Foo.method_defined?(_)} if Foo.respond_to? :public_method_defined? p m.collect {|_| Foo.public_method_defined?(_)} p m.collect {|_| Foo.private_method_defined?(_)} p m.collect {|_| Foo.protected_method_defined?(_)} end puts '---' p m.collect {|_| Foo.instance_methods.member?(_)} p m.collect {|_| Foo.public_instance_methods.member?(_)} p m.collect {|_| Foo.private_instance_methods.member?(_)} p m.collect {|_| Foo.protected_instance_methods.member?(_)} puts '---' p m.collect {|_| foo.methods.member?(_)} p m.collect {|_| foo.public_methods.member?(_)} p m.collect {|_| foo.private_methods.member?(_)} p m.collect {|_| foo.protected_methods.member?(_)} => ruby 1.6.8 (2002-12-24) [i586-linux] [true, false, true] --- [true, false, false] [true, false, false] [false, true, false] [false, false, true] --- [true, false, false] [true, false, false] [false, true, false] [false, false, true] => ruby 1.8.0 (2003-03-09) [i586-linux] [true, false, true] [true, false, false] [false, true, false] [false, false, true] --- [true, false, true] [true, false, false] [false, true, false] [false, false, true] --- [true, false, true] [true, false, false] [false, true, false] [false, false, true]
采用了符号的扩展表示法。[ruby-dev:18537]
p :"foo#{"bar"}" p :'foo#{"bar"}' p %s{foo#{"bar"}} => ruby 1.7.3 (2002-11-14) [i586-linux] :foobar :"foo\#{\"bar\"}" :"foo\#{\"bar\"}"
修改了rescue修饰部分的优先级。好像是试验性的修改。 (在1.8版本中正式采用了这个修改)。因此
a = b rescue c
不会被解释成
(a = b) rescue c
而是被解释为
a = (b rescue c)
虽然与if修饰部分的优先级有所不同,但它有个好处:如果b发生异常时可以使用c的值。
# 若在以前的版本(1.6)中执行下列代码时,则不会进行赋值 # 只是对变量进行了定义,结果是v等于nil。 v = raise rescue true p v => ruby 1.6.7 (2002-03-01) [i586-linux] nil => ruby 1.7.3 (2002-10-18) [i586-linux] true
使用它就会出现警告。请您使用Object#class来代替它。
p Object.new.type => -:1: warning: Object#type is deprecated; use Object#class ruby 1.7.3 (2002-10-08) [i586-linux] Object
在类定义表达式的末尾才会调用inherited方法。 [ruby-bugs-ja:PR#342]
def Object.inherited(c) p "inherited!" end class Foo p "defining Foo" end => ruby 1.6.7 (2002-03-01) [i586-linux] "inherited!" "defining Foo" => ruby 1.7.3 (2002-10-04) [i586-linux] "defining Foo" "inherited!"
若在方法定义的外侧调用return的话,则会在运行时而非编译时引发错误。
p :doing return => -:2: return appeared outside of method ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.7.3 (2002-10-04) [i586-linux] :doing -:2: unexpected return
以前,使用||=对未定义的变量进行赋值时,会在全局变量中出现警告。另外,在类变量中会引发错误。 [ruby-dev:18278]
local ||= 1 @instance ||= 1 $global ||= 1 @@class ||= 1 => -:3: warning: global variable `$global' not initialized -:4: uninitialized class variable @@class in Object (NameError) ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.7.3 (2002-09-13) [i586-linux]
在mswin32版和mingw32版中,ruby会在内部将进程ID变为正数。虽然在NT系列的OS中没有什么变化,但在Win9x系列的OS中,由OS控制的进程ID是负数,所以才将其变为正数。[ruby-dev:18263]
在对File::NONBLOCK模式的IO进行读入操作时,如果发生EWOULDBLOCK的话,可能会导致读入数据丢失。 [ruby-dev:17855]
在使用Thread的程序中,如果从文件中读出数据并写入socket时,可能会在Socket#write中引发Errno::EINTR,但这种情况极少出现。[ruby-dev:17878], [ruby-core:00444]
无法对包含(include)了无名模块的对象进行dump。 [ruby-dev:18186]
class << obj = Object.new include Module.new end Marshal.dump(obj) => ruby 1.6.7 (2002-03-01) [i586-linux] => -:4:in `dump': can't dump anonymous class #<Module:0x401a871c> (ArgumentError) from -:4 ruby 1.7.3 (2002-09-06) [i586-linux]
可以dump包含(include)了有名模块的对象,此时模块的信息被保存到dump format之中。
module M def foo p :foo end end class << obj = Object.new include M end p dump = Marshal.dump(obj) p obj2 = Marshal.load(dump) class << obj2 p included_modules end obj2.foo => ruby 1.6.7 (2002-03-01) [i586-linux] "\004\006o:\vObject\000" #<Object:0x401a9630> [Kernel] -:14: undefined method `foo' for #<Object:0x401a9630> (NameError) => ruby 1.7.3 (2002-09-06) [i586-linux] "\004\ae:\006Mo:\vObject\000" #<Object:0x401a821c> [M, Kernel] :foo
因此将format version由4.7提升到4.8。 (2002-09-17)
开始着手合并extmk.rb和mkmf.rb。extmk.rb将会用到mkmf.rb。相应地对mkmf.rb也作出调整。[ruby-dev:18109]
定义规定:类的特殊类的特殊类,就是特殊类本身[ruby-bugs-ja:PR#313]。不太明白(^^;
class << Object p [self.id, self] class << self p [self.id, self] end end => ruby 1.6.7 (2002-03-01) [i586-linux] [537771634, Class] [537742484, Class] => ruby 1.7.3 (2002-09-05) [i586-linux] [537771634, #<Class:Object>] [537771634, #<Class:Object>]
另外好像说,对象的特殊类的超类的特殊类 和 对象的特殊类的特殊类的超类是一回事儿[ruby-bugs-ja:PR#324]。更不明白了(^^;;
class << Object.new class << self.superclass p [self.id, self] end class << self p [self.superclass.id, self.superclass] end end => ruby 1.6.7 (2002-03-01) [i586-linux] [537771634, Class] [537771644, Class] => ruby 1.7.3 (2002-09-05) [i586-linux] [537771634, #<Class:Object>] [537771634, #<Class:Object>]
[ruby-bugs-ja:PR#336]中好像还有些变化 (请参考2002-09-21的ChangeLog。)
新增
新增(后来改名为copy_object。再后来又改名为initialize_copy)
ary = [1,2,3] p ary, ary.id ary.become [3,2,1] p ary, ary.id => ruby 1.7.3 (2002-08-30) [i586-linux] [1, 2, 3] 537743354 [3, 2, 1] 537743354 ary = [1,2,3] p ary, ary.id ary.replace [3,2,1] p ary, ary.id => ruby 1.7.3 (2002-08-30) [i586-linux] [1, 2, 3] 537743354 [3, 2, 1] 537743354 obj = Object.new p obj, obj.id obj.become Object.new p obj, obj.id => ruby 1.7.3 (2002-08-30) [i586-linux] #<Object:0x401a9ff4> 537743354 #<Object:0x401a9ff4> 537743354
保证了mswin32版ruby 和 MinGW版ruby中的扩展库的兼容性。分别把Config::CONFIG['RUBY_SO_NAME']变更为msvcrt-rubyXX(成为DLL名),把Config::CONFIG['sitearch'](扩展库所在地的路径元素)变更为"i386-msvcrt"。 [ruby-dev:17144], [ruby-dev:18047]
在这次修改中,新增了sitearch(在其他环境中,则与CONFIG['arch']相同)
另外请参考Win32 native版的脚注
在各输出方法中,只有putc不使用write方法。 [ruby-dev:18038]
class << foo = STDOUT.dup def write(s) p "foo" end end foo.putc("bar") puts => ruby 1.6.7 (2002-03-01) [i586-linux] b => ruby 1.7.3 (2002-09-05) [i586-linux] "foo"
新增 [ruby-dev:17966]
在Proc#to_s 的结果中新增了脚本的源文件名和行号。[ruby-dev:17968]
p Proc.new { 2 3 }.to_s => -:2: warning: useless use of a literal in void context ruby 1.6.7 (2002-03-01) [i586-linux] "#<Proc:0x401ab8b8>" => -:2: warning: useless use of a literal in void context ruby 1.7.3 (2002-09-05) [i586-linux] "#<Proc:0x0x401a87d0@-:2>"
不能将字符串指定给参数了。
[1,2,3].find("p :nothing") {|v| v > 5} => ruby 1.6.7 (2002-03-01) [i586-linux] :nothing => -:1:in `find': undefined method `call' for "p :nothing":String (NoMethodError) from -:1 ruby 1.7.2 (2002-08-01) [i586-linux]
另外,若没有找到元素的话,就返回ifnone 的结果。
p [1,2,3].find(proc {:nothing}) {|v| v > 5} => ruby 1.6.7 (2002-03-01) [i586-linux] nil => ruby 1.7.2 (2002-08-01) [i586-linux] :nothing
新增。
在生成随机数的算法中使用了Mersenne Twister。
允许对方法定义进行嵌套。
def func1 def func2 p :func2 end end func1 func2 => -:2: nested method definition ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.7.3 (2002-09-05) [i586-linux] :func2
允许在方法定义中出现alias, undef。
def bar end def foo p :foo undef bar end foo def bar p :bar alias foo bar end bar foo => -:5: undef within method -:12: alias within method ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.7.3 (2002-09-05) [i586-linux] :foo -:10: warning: method redefined; discarding old bar -:10: warning: overriding global function `bar' :bar :bar
在方法定义外侧调用super时,将会在运行时而不是编译时引发错误。
p 1 super => -:2: super called outside of method ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.7.3 (2002-09-05) [i586-linux] 1 -:2: super called outside of method (NoMethodError)
也许[ruby-dev:16969]中给出了变更的理由。[ruby-dev:17882]
新增了10进制整数字面值的0d前缀。
p 0d10 => ruby 1.7.3 (2002-09-04) [i586-linux] 10 p 0d10.1 => -:1: parse error ruby 1.7.3 (2002-09-04) [i586-linux]
允许使用大写字母。
p 0D10 => ruby 1.7.3 (2002-09-04) [i586-linux] 10
但不能像下面这样。
p(/\d10/) p "\d10" => ruby 1.7.3 (2002-09-04) [i586-linux] /\d10/ "d10"
只要字面值允许,Integer()也就允许。
p Integer("0d010") => ruby 1.7.3 (2002-09-04) [i586-linux] 10 p Integer("0d010.1") => -:1:in `Integer': invalid value for Integer: "0d010.1" (ArgumentError) from -:1 ruby 1.7.3 (2002-09-04) [i586-linux]
String#to_i、String#oct也是如此
p "0d010".to_i p "0d010".oct => ruby 1.6.7 (2002-03-01) [i586-linux] 0 0 => ruby 1.7.3 (2002-09-04) [i586-linux] 10 10
新增set_socket方法
新增了8进制字面值的0和0o前缀。
p 0o377 => ruby 1.7.3 (2002-09-04) [i586-linux] 255
可以使用大写字母。
p 0O377 => ruby 1.7.3 (2002-09-04) [i586-linux] 255
不能像下面这样。
p(/\o377/) p "\o377" => ruby 1.7.3 (2002-09-04) [i586-linux] /\o377/ "o377"
只要字面值允许,Integer()也没问题。
p Integer("0o377") => -:1:in `Integer': invalid value for Integer: "0o377" (ArgumentError) from -:1 ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.7.3 (2002-09-04) [i586-linux] 255
String#to_i、String#oct也是如此
p "0o377".oct p "0o377".to_i(8) => ruby 1.6.7 (2002-03-01) [i586-linux] 0 -:2:in `to_i': wrong # of arguments(1 for 0) (ArgumentError) from -:2 => ruby 1.7.3 (2002-09-04) [i586-linux] 255 255
若将字符串而非正则表达式传给pattern的话,就直接把它用作匹配模型,而不会将其编译成正则表达式。(准确地讲,不会Regexp.compile(arg)这样处理,而是Regexp.compile(Regexp.quote(arg))这样)
只有str =~ arg中的arg是字符串时,才会执行str.index(arg),它等价于Regexp.compile(Regexp.quote(arg)) =~ str(所以没有设定$~)。
p "aaaa*".scan("a*") => ruby 1.6.7 (2002-03-01) [i586-linux] ["aaaa", "", ""] => -:1: warning: string pattern instead of regexp; metacharacters no longer effective ruby 1.7.3 (2002-09-04) [i586-linux] ["a*"] p "aa*aa*aa*".split("a*") => ruby 1.6.7 (2002-03-01) [i586-linux] ["", "*", "*", "*"] => -:1: warning: string pattern instead of regexp; metacharacters no longer effective ruby 1.7.3 (2002-09-04) [i586-linux] ["a", "a", "a"] p "aa*".sub('a*', '') => ruby 1.6.7 (2002-03-01) [i586-linux] "*" => -:1: warning: string pattern instead of regexp; metacharacters no longer effective ruby 1.7.3 (2002-09-04) [i586-linux] "a" p "aa*aa*aa*aa*".gsub('a*', '') => ruby 1.6.7 (2002-03-01) [i586-linux] "****" => -:1: warning: string pattern instead of regexp; metacharacters no longer effective ruby 1.7.3 (2002-09-04) [i586-linux] "aaaa" $_ = "aa*" p ~"a*" => ruby 1.6.7 (2002-03-01) [i586-linux] 0 => ruby 1.7.3 (2002-09-04) [i586-linux] 1
getbinaryfile() 的第二参数(本地文件名)变为可选参数。新增get(), put(), binary(),binary = 方法
听说加入了支持Win32用的双向管道的补丁 [ruby-win32:185]
使用它的话会出现警告消息。(听说已经变成obsolete)
p Object.new.to_a => ruby 1.6.7 (2002-03-01) [i586-linux] [#<Object:0x401ab8b8>] => -:1: warning: default `to_a' will be obsolete ruby 1.7.3 (2002-09-02) [i586-linux] [#<Object:0x401a88ac>]
Array()的参数不再接受nil。 (在ruby 1.8.0 (2003-05-29)中,又开始接受nil了)
p Array(nil) => ruby 1.6.7 (2002-03-01) [i586-linux] [] => -:1:in `Array': cannot convert nil into Array (TypeError) from -:1 ruby 1.7.3 (2002-09-02) [i586-linux] => ruby 1.8.0 (2003-05-29) [i586-linux] []
新增了%W(...) 数组字面值。与%w()不同的是,它可以使用反斜线表示法和展开式。[ruby-dev:15988]
v = "b c" p %W(a #{v}d\se) => ruby 1.7.3 (2002-09-04) [i586-linux] ["a", "b cd e"]
在把数值或字符串以外的对象变换为整数时,不再使用to_i,而是使用to_int进行变换。
class << obj = Object.new def to_i() 0 end def to_int() 1 end end p Integer(obj) => ruby 1.6.7 (2002-03-01) [i586-linux] 0 => ruby 1.7.3 (2002-09-02) [i586-linux] 1
新增
p nil.to_f => -:1: undefined method `to_f' for nil (NameError) ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.7.3 (2002-09-02) [i586-linux] 0.0
Float()的参数不再接受nil。
p Float(nil) => ruby 1.6.7 (2002-03-01) [i586-linux] 0.0 => -:1:in `Float': cannot convert nil into Float (TypeError) from -:1 ruby 1.7.3 (2002-09-02) [i586-linux]
在#{ ... }展开式中,可以书写任何ruby程序,包括字符串分隔符在内。虽然以前也是如此,但此次则明确了规则。也就是说,展开式中的语法规则与外面相同。ruby程序会被正确解析。[ruby-dev:17422]
(1.6 版本中,曾出现过异常的举动)
p "#{ "foo" }" => ruby 1.6.7 (2002-03-01) [i586-linux] "foo" => -:1: warning: bad substitution in string -:1: parse error p "#{ "foo" }" ^ ruby 1.6.7 (2002-08-21) [i586-linux] => ruby 1.6.8 (2002-12-24) [i586-linux] "foo" => ruby 1.7.3 (2002-09-02) [i586-linux] "foo"
不应该对下列分隔符进行转义。
p "#{ \"foo\" }" => ruby 1.6.7 (2002-03-01) [i586-linux] "foo" => ruby 1.6.7 (2002-08-21) [i586-linux] "foo" => -:1: warning: escaped terminator '"' inside string interpolation ruby 1.7.3 (2002-09-02) [i586-linux] "foo"
请注意:展开式中注释并不是从 # 到 } ,而是从 # 到换行。
p "#{ "foo" # comment }" => ruby 1.6.7 (2002-03-01) [i586-linux] "foo" => -:1: parse error ruby 1.7.3 (2002-09-02) [i586-linux] p "#{ "foo" # comment }" => ruby 1.6.7 (2002-03-01) [i586-linux] "foo" => ruby 1.7.3 (2002-09-02) [i586-linux] "foo"
字符串字面值中的行首的 __END__ 不再被当作脚本的结束标志了。[ruby-dev:17513]
# p " #__END__ #" p eval(%Q(p "\n__END__\n")) => -:1: compile error (SyntaxError) (eval):1: unterminated string meets end of file ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.7.3 (2002-09-02) [i586-linux] "\n__END__\n" nil
?空格、?换行、?TAB 等不再是字面值。若必须使用的话,可以写成 ?\s, ?\n, ?\t 。(请注意,下例中的前半部分使用了双引号) [ruby-bugs-ja:PR#261], [ruby-dev:17446]
p eval("?\t") p eval("?\n") p eval("?\v") p eval("?\f") p eval("?\r") p eval("? ") => ruby 1.6.7 (2002-03-01) [i586-linux] 9 10 11 12 13 32 => -:1: compile error (SyntaxError) (eval):1: parse error ruby 1.7.3 (2002-09-02) [i586-linux] p eval('?\t') p eval('?\n') p eval('?\v') p eval('?\f') p eval('?\r') p eval('?\s') => ruby 1.6.7 (2002-03-01) [i586-linux] 9 10 11 12 13 32 => ruby 1.7.3 (2002-09-02) [i586-linux] 9 10 11 12 13 32
合并了支持在bcc中编译ruby解释器的补丁。
Range#max, Range#min, Range#include? 使用 <=> 方法进行范围计算。[ruby-list:35253], [ruby-dev:17228] (2003-03-18: min, max 变回原样。[ruby-dev:19837])
Range#member? 使用 each 来遍历所有元素并确认是否有member。(与Enumerable#member?相同)
截止1.6,max, min, member? include? 是 Enumerable 的方法,=== 是 Range的方法。在1.7中,max, min, member?, include?, === 都是 Range 的方法,include? 成了 === 的别名。(在1.8中,max, min重新成为 Enumerable 的方法)
因为这些变动导致下列不同。
p((0.1 .. 2.0).include?(1.1)) => ruby 1.6.7 (2002-03-01) [i586-linux] false => ruby 1.7.3 (2002-09-02) [i586-linux] true p((0.1 .. 2.0).member?(1.0)) => ruby 1.6.7 (2002-03-01) [i586-linux] true => -:1:in `member?': cannot iterate from Float (TypeError) from -:1 ruby 1.7.3 (2002-09-02) [i586-linux] p "b" < "ba" p(("a"..."bc").max) => ruby 1.6.7 (2002-03-01) [i586-linux] true "b" => ruby 1.7.3 (2002-09-05) [i586-linux] true "bc" => ruby 1.8.0 (2003-03-20) [i586-linux] true "b"
新增
Range#each 使用各元素的 succ 方法进行迭代操作。
(1.0 .. 2.0).each {|v| p v} => ruby 1.6.7 (2002-03-01) [i586-linux] 1 2 => -:1:in `each': cannot iterate from Float (TypeError) from -:1 ruby 1.7.3 (2002-09-02) [i586-linux] class Float def succ self + 1.0 end end (1.0 .. 2.0).each {|v| p v} => ruby 1.7.3 (2002-09-02) [i586-linux] 1.0 2.0
该方法也被删除。 [ruby-talk:64479], [ruby-talk:72133]
p(("a".."z").size) => ruby 1.6.7 (2002-03-01) [i586-linux] 26 => -:1: undefined method `size' for #<Range:0x401aa780> (NoMethodError) ruby 1.7.2 (2002-08-01) [i586-linux]
若想得到Range的元素数量,必须这样
p(("a".."z").to_a.size) => ruby 1.7.2 (2002-08-01) [i586-linux] 26
才行。
新增
2003-01-21: 该修改好像是变回原来的样子
对 -数值 的字面值的解释发生了变化,-数值 总是被当作一个字面值来处理。
例如,下面的表达式的结果就各不相同。
p -2**2 => -:1: warning: ambiguous first argument; make sure ruby 1.6.7 (2002-03-01) [i586-linux] -4 => -:1: warning: ambiguous first argument; make sure ruby 1.7.2 (2002-08-01) [i586-linux] 4 => -:1: warning: ambiguous first argument; make sure ruby 1.8.0 (2003-03-12) [i586-linux] -4
以前-2**2 被解释成-(2**2)。这是由于操作符的优先级不同所致 (真的如此吗?)。在1.7中则被解释成(-2)**2。另外,若在 - 和数值之间插入空格的话, - 会被当作单项操作符(方法)。(这与以前相同)
p(- 2**2) => ruby 1.6.7 (2002-03-01) [i586-linux] -4 => ruby 1.7.2 (2002-08-01) [i586-linux] -4 => ruby 1.8.0 (2003-03-12) [i586-linux] -4 class Fixnum def -@ 1 end end p(- 2**2) => -:2: warning: discarding old -@ ruby 1.6.7 (2002-03-01) [i586-linux] 1 => -:2: warning: method redefined; discarding old -@ ruby 1.7.2 (2002-08-01) [i586-linux] 1 => -:2: warning: method redefined; discarding old -@ ruby 1.8.0 (2003-03-12) [i586-linux] 1
新增
在将字符串变为浮点数时,不再依赖库函数 strtod(3)了。这样,即使修改了库的内容,也不会影响到它的运作。
p "0xa.a".to_f => ruby 1.6.7 (2002-03-01) [i586-linux] 10.625 => ruby 1.7.2 (2002-08-01) [i586-linux] 0.0
表示最大精度的格式由"%.10g"变为"%.16g"。(2003-03-20: 其后又变为"%.15g" [ruby-bugs-ja:PR#406])
p 1.0/3 p 99.6 => ruby 1.6.7 (2002-03-01) [i586-linux] 0.3333333333 99.6 => ruby 1.7.2 (2002-08-01) [i586-linux] 0.3333333333333333 99.59999999999999 => ruby 1.8.0 (2003-03-20) [i586-linux] 0.333333333333333 99.6
可以使用limit来指定等待线程的时间。
新增
在使用 & 来修饰方法的参数时,若传给参数的对象中包含to_proc 方法就调用它,并把结果当作块来传给方法。以前,& 就只能修饰Proc, Method对象。另外,还新增了Proc#to_proc。
class Foo def to_proc p "should generate Proc object" end end def foo end foo(&Foo.new) => ruby 1.7.2 (2002-04-24) [i586-linux] "should generate Proc object" -:10: wrong argument type Foo (expected Proc) (TypeError)
从Fixnum, Integer移动到这里。
新增。[ruby-dev:16909]
p /foo(bar)*/.to_s => "(?-mix:foo(bar)*)"
新增。返回文件名中的扩展名。[ruby-talk:37617]
新增。
以前,若遇到比-2147483648还小的数值时,其2进制、8进制、16进制的表示形式就会出问题 [ruby-list:34828]
p "%b" % -2147483648 p "%b" % -2147483649 p "%b" % -2147483650 => ruby 1.6.7 (2002-03-01) [i586-linux] "..10000000000000000000000000000000" "..1" "..10" => ruby 1.7.2 (2002-04-11) [i586-linux] "..10000000000000000000000000000000" "..101111111111111111111111111111111" "..101111111111111111111111111111110"
raise SystemExit时,会使用结束状态值 1 。 [ruby-dev:16776]
新增
新增 [ruby-talk:21612], [ruby-talk:36703]
在Net::HTTP 的类方法中,可以使用URI对象了。
Net::HTTP.get_print(URI.parse('http://www.ruby-lang.org/ja/'))
请注意,在实例方法中则无法使用。
在包含rescue/ensure的begin语句中,也可以使用while/until来进行修饰了。
以前在包含rescue/ensure的while/until修饰表达式中,并没有最先执行主体部分(与C语言中的do ... while语法相同)。 [ruby-list:34618]
i = 0 begin p i i += 1 rescue end while i < 0 => ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.7.2 (2002-03-29) [i586-linux] 0
不仅可以在方法定义中使用rescue/ensure,在类定义或模块定义中也可以如此。
class Foo hogehoge rescue p $! end => -:3: parse error ruby 1.6.7 (2002-03-01) [i586-linux] => ruby 1.7.2 (2002-03-29) [i586-linux] #<NameError: undefined local variable or method `hogehoge' for Foo:Class>
已结束(aborting)的线程也被包含到列表中。 [rubyist:1282]
th = Thread.new {sleep} Thread.critical = true th.kill p Thread.list => ruby 1.6.7 (2002-03-01) [i586-linux] [#<Thread:0x401ba5c8 run>] => ruby 1.7.2 (2002-03-29) [i586-linux] [#<Thread:0x401b0618 aborting>, #<Thread:0x401ba0b4 run>]
若对已结束(aborting)的线程使用上述方法时,该线程就会起死回生。现在已经修复了这个bug。 [rubyist:1282]
在sprintf 的 '%u' 中,不再新增".."了。[ruby-dev:16522]
p sprintf("%u", -1) => ruby 1.6.7 (2002-03-01) [i586-linux] "..4294967295" => -:1: warning: negative number for %u specifier ruby 1.7.2 (2002-03-29) [i586-linux] "4294967295"
打上了支持VMS的补丁。
新增了下列各库。 iconv.so, tsort.rb, stringio.so, strscan.so, fileutils.rb, racc/*
可以指定Dir.glob的第2参数(决定匹配方式的标识)了。在Dir[] 中则无法使用该标识。
新增了相关的常数 File::FNM_DOTMATCH (表示 与FNM_PERIOD相反)。
p Dir.glob("/*") => ruby 1.7.2 (2002-03-15) [i586-linux] ["/lost+found", "/root", ...] p Dir.glob("/*", File::FNM_DOTMATCH) => ruby 1.7.2 (2002-03-15) [i586-linux] ["/.", "/..", "/lost+found", "/root", "/boot", ...]
可以正确处理large file(大小超过4G bytes的文件)了(真的?) [ruby-talk:35316], [ruby-talk:35470]
在mswin32, mingw32中,也可以使用Process.kill(9, pid)来强制结束进程(TerminateProcess)。(好像Process.kill("KILL", pid)就不行???2002-08-28 以后好像可以使用 "KILL" 了)
新增
可以指定结束消息了。
abort("abort!") => abort! ruby 1.7.2 (2002-03-15) [i586-linux]
您所指定的消息会被设置给异常SystemExit对象的message 属性。
begin abort("abort!") rescue SystemExit p $!.message end => abort! ruby 1.7.2 (2002-03-29) [i586-linux] "abort!"
文档中没有提到 [ruby-dev:16126]
传递若干个模块时,include的顺序有所改变。好像[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] obj = Object.new module Foo; end module Bar; end module Baz; end obj.extend Foo, Bar, Baz class << obj p ancestors end => ruby 1.6.7 (2002-03-01) [i586-linux] [Baz, Bar, Foo, Object, Kernel] => ruby 1.7.2 (2002-03-08) [i586-linux] [Foo, Bar, Baz, Object, 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]
新增
[ruby-bugs-ja:PR#98] (2003-03-11: 该修改被取消 [ruby-dev:19799]) (其后Proc#yield也被取消)
Proc.new { break }.call Proc.new { break }.yield => -:2:in `yield': break from proc-closure (LocalJumpError) from -:2 ruby 1.7.3 (2002-09-05) [i586-linux] => ruby 1.8.0 (2003-03-12) [i586-linux]
可以在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"
新增(其后变为exit_value)
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相同。
新增
比较两个没有继承关系的类/模块时,将返回nil。
p Array <=> String => ruby 1.6.7 (2002-03-01) [i586-linux] 1 => ruby 1.7.3 (2002-09-13) [i586-linux] nil
新增
新征了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
可以指定块了。还可以控制重复键的处理方式。
新增
当$SAFE为1或2时,被污染的Proc将无法变成块 [ruby-dev:15682]
$SAFE = 1 proc = proc {} proc.taint p proc.tainted? def foo(&b) p b.tainted? end foo(&proc) => ruby 1.6.8 (2003-08-03) [i586-linux] true true => ruby 1.7.2 (2002-01-23) [i586-linux] true true
可以将基数(2,8,10,16)指定给参数。(2002-01-26: 当参数为0时,用prefix来判定基数)
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]
新增(此后被values_at方法所取代)
# 没有给出块的话,则与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) 相同。
对Float进行dump时,不再依赖sprintf(3)了。format version由4.6升到4.7。 (此后,由于把strtod(3)收入了语言本身,即使进行读入时也不再依赖strtod(3)了)
如将受污染的字符串传给第二参数的话,就会引发SecurityError异常。在1.6中,若安全级别为4则会计算受污染的字符串。 [ruby-list:32215]
在Module.new, Class.new中,若给出了块的话,则在生成的模块/类的上下文中计算块的内容。
Module.new {|m| p m} => ruby 1.7.1 (2001-10-15) [i586-linux] #<Module:0x401afd5c>
不能对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]
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]
若方法名和括弧之间有空格,则该括号不会为当作是包含参数的括号,而会被当作表达式中的括号。
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
若对结构体类的子类进行dump的话,则无法读出。[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]
新增
String#[re, idx] String#[re, idx] = val
新增第二个可选参数idx。
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/] 相同。
由allocate 和 initialize 这两个方法来生成对象。[ruby-dev:14847] 请参考 rb_define_alloc_func() 。
若将数组传给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能返回值了。
class/module 返回最后计算的表达式的值。def返回nil。while/until通常返回 nil,若使用带参数的break的话,则可以返回任何值。
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来和每个元素进行比较。
(2002-06-04: 之后作的修改)
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。
新增。忽略字母的大小写区别来比较字符串。
不管$=的值如何,总是区分字母的大小写。
新增 [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
新增 [ruby-dev:13597] (之后又被删除了)
除去它不检查参数的个数之外,其他则与Proc#call 相同。
新增
在File::Constants模块中定义了该方法所用的FNM_NOESCAPE, FNM_PATHNAME, FNM_PERIOD, FNM_CASEFOLD标识。
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] [] => ruby 1.8.0 (2003-01-18) [i586-linux] [nil]
但好像是又改回去了。与2003-01-07 的 eval.c的块参数比较起来,它应该是正确的。
def foo yield nil yield end foo {|*a| p a} => ruby 1.6.8 (2002-12-24) [i586-linux] [nil] [nil] => ruby 1.8.0 (2003-08-04) [i586-linux] [nil] []
修正了下列问题。现在,只包含1元素的数组也能被正常展开。
a = *[1] p a #=> [1] => ruby 1.6.8 (2002-12-24) [i586-linux] [1] => ruby 1.7.1 (2001-06-05) [i586-linux] 1
重新回到NameError を StandardError 的子类中去。类的层次关系如下。
NoMethodError < NameError < StandardError.
以前,只有将第2参数指定为数值(File::RDONLY|File::CREAT等)时,才会使用第3参数。现在只要给出了第3参数,就总是有效的。[ruby-bugs-ja:PR#54]
由于使用了内部的哈希表,所以使用常数的速度有所提升。(对应于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)
这样(这只是试验性的修改)。
新增。现在(因为会自动进行数组变换,所以)可以写成这样。(2003-03-29: 此后Range#to_ary就被删除了)
a, b, c = 1..3 p [a, b, c] => ruby 1.6.8 (2002-12-24) [i586-linux] [1..3, nil, nil] => ruby 1.7.3 (2002-12-11) [i586-linux] [1, 2, 3] => ruby 1.8.0 (2003-03-29) [i586-linux] [1..3, nil, nil]
使用参数之后,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]
如果把一个包含to_str方法的非字符串对象传给扩展库的API--STR2CSTR()的话,它就会在内部调用to_str,进行隐式的类型转换。此时虽然能返回变换结果所保持的字符串指针,但在该API中,这个隐式变换的结果不会被任何对象所使用,因此可能会被GC回收掉。 [ruby-dev:12731]
version 1.7以后,使用StringValuePtr()来替代它。此时,参数所用的对象会被隐式转换结果所替代,因此变换结果不会被GC所回收。(在version 1.7中,STR2CSTR()变成obsolete)
另外还准备了一个新的API--StringValue()。在需要对参数进行to_str的隐式类型变换时使用它。若参数是字符串的话,则不进行任何操作。把它用在处理字符串的方法的前面则会相当方便。
目前还没有开发出替代str2cstr() (返回C指针和字符串长度)的安全的API。(在[ruby-dev:15644]中有一些建议)
只有在使用-e选项的单行脚本中,才能对 范围操作符表达式中的单个数值字面值 和 $.
进行比较。
使用Module#===来比较 发生的异常$! 和 rescue中的异常类。
以前使用kind_of?来进行比较时,基本上也没有什么问题。这里主要是对SystemCallError.===进行了重定义,只要两个异常的errno相同就把它们看作是同一个异常。因此,若Errno::EWOULDBLOCK 和 Errno::EAGAIN的意义相同(相同的errno)时,不管指定哪个,都可以进行rescue。
后来,只要两个Errno::XXX对象的errno相同,就被看作是相同的异常,因此这个修改也就失效了,但却一直保留下来。 (或许在用户定义异常类时还能用到) [ruby-dev:19589]
在不带块的时候,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中的bug [ruby-list:30481] (1.6 中也进行了修正)
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
新增
新增 [ruby-talk:14289]
与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输出的dump format的版本号。 [ruby-dev:14172]
新增 [ruby-dev:12766] (2003-03-28: 后来又消失了)
为了方便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
新增
新增。返回商。
(之后变成div(?))
新增 [ruby-dev:12763]
旧称被删除。请使用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)
新增。$?
的值从整数中分离出来,变成该类的实例。
新增
新增
新增了可选参数。
新增
新增。比较字符串而不区分大小写。
新增
与str[n, 0] = other
相同(但会返回 self)
新增 [ruby-dev:12921]
新增(???之后又被删除)
新增 (请参考上面的「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")