Ruby 2.0.0 的 NEWS¶ ↑
本文档列出了版本之间用户可见的特性变更,不包括缺陷修复。
请注意,每个条目都非常简洁,不提供背后的原因或参考信息。有关包含所有足够信息的完整更改列表,请参阅 ChangeLog 文件。
自 1.9.3 版本以来的变更¶ ↑
语言变更¶ ↑
-
添加了关键字参数。
-
添加了 %i 和 %I 用于符号列表的创建(类似于 %w 和 %W)。
-
默认源编码更改为 UTF-8。(以前是 US-ASCII)
-
对于以“_”开头的未使用变量,不发出警告
核心类更新(仅列出重要的)¶ ↑
-
-
添加了方法
-
添加了 ARGF#codepoints 和
ARGF#each_codepoint
,类似于IO
的相应方法。
-
-
-
-
添加了方法
-
添加了
Array#bsearch
用于二分查找。
-
-
不兼容的变更
-
Array#shuffle!
和Array#sample
的 random 参数现在将使用一个参数调用,即最大值。 -
当给定
Range
参数时,对于每个超出范围的值,Array#values_at
现在返回 nil。
-
-
-
-
添加了方法
-
添加了
Enumerable#lazy
方法用于惰性枚举。
-
-
-
-
添加了方法
-
添加了
Enumerator#size
用于惰性大小评估。
-
-
扩展方法
-
Enumerator.new
接受一个用于惰性大小评估的参数。
-
-
新类
Enumerator::Lazy
用于惰性枚举
-
-
-
别名方法
-
ENV.to_h
是ENV.to_hash
的新别名
-
-
-
-
不兼容的变更
-
Fiber#resume
不能恢复调用了“Fiber#transfer”的纤程。
-
-
-
-
扩展方法
-
如果给定了 File::FNM_EXTGLOB 选项,
File.fnmatch?
现在会扩展模式中的花括号。
-
-
-
-
改进
-
引入了位图标记,它会阻止复制具有写时复制的内存页。
-
引入了非递归标记,它避免了意外的堆栈溢出。
-
-
-
GC::Profiler
-
添加了方法
-
添加了 GC::Profiler.raw_data,它返回
GC
的原始配置文件数据。
-
-
-
-
添加了方法
-
添加了
Hash#to_h
作为显式转换方法,类似于Array#to_a
。
-
-
扩展方法
-
Hash#default_proc=
可以传递 nil 来清除默认的 proc。
-
-
-
-
已弃用的方法
-
IO#lines、bytes、chars 和 codepoints 已被弃用。
-
-
-
-
添加了方法
-
添加了
Kernel#Hash
转换方法,类似于 Array() 或 Float()。 -
添加了
Kernel#__dir__
,它返回调用此方法的文件所在目录的绝对路径。 -
添加了
Kernel#caller_locations
,它返回帧信息对象的数组。
-
-
扩展方法
-
Kernel#warn
像 puts 一样接受多个参数。 -
Kernel#caller
接受第二个可选参数 'n',用于指定所需的调用者大小。 -
Kernel#to_enum 和 enum_for 接受一个用于惰性大小评估的块。
-
-
不兼容的变更
-
system() 和 exec() 关闭非标准文件描述符(默认的 :close_others 选项默认更改为 true。)
-
除非第二个参数为 true,否则对受保护方法的 respond_to? 现在返回 false。
-
__callee__ 已恢复为原始行为,现在返回被调用的名称,而不是别名方法中的原始名称。
-
Kernel#inspect 不再调用 to_s(它以前调用重新定义的 to_s)。
-
-
-
-
添加了方法
-
添加了
LoadError#path
方法,用于返回无法加载的文件名。
-
-
-
-
添加了方法
-
添加了
Module#prepend
,它类似于Module#include
,但是前置模块中的方法会覆盖前置模块中的相应方法。 -
添加了
Module.prepended
和Module.prepend_features
,类似于 included 和 append_features。 -
添加了
Module#refine
,它可以在本地扩展类或模块。[实验性]
-
-
扩展方法
-
Module#define_method
接受来自Module
的UnboundMethod
。 -
Module#const_get
接受限定的常量字符串,例如 Object.const_get("Foo::Bar::Baz")
-
-
-
Mutex
-
添加了方法
-
添加了 Mutex#owned?,它返回互斥锁是否由当前线程持有。[实验性]
-
-
不兼容的变更
-
不允许从 trap 处理程序中使用 Mutex#lock、Mutex#unlock、Mutex#try_lock、Mutex#synchronize 和 Mutex#sleep,否则会在这种情况下引发
ThreadError
。 -
Mutex#sleep 可能会虚假唤醒。在唤醒后检查。
-
-
-
-
添加了方法
-
添加了 nil.to_h,它返回 {}
-
-
-
-
用于保存对对象的弱引用的新的底层类。
-
-
-
不兼容的变更
-
删除了
Proc#==
和 eql?,因此只有当两个 proc 是同一个对象时,它们才 ==。
-
-
-
-
添加了方法
-
添加了 getsid 用于获取会话 ID(仅限 Unix)。
-
-
-
-
添加了方法
-
添加了
Range#size
用于惰性大小评估。 -
添加了
Range#bsearch
用于二分查找。
-
-
-
RubyVM
(MRI 特有)-
添加了
RubyVM::InstructionSequence.of
以从方法或块中获取指令序列。 -
添加了
RubyVM::InstructionSequence#path
、absolute_path、label、base_label 和 first_lineno 来检索指令序列定义位置的信息。 -
添加了用于指定堆栈使用情况的环境变量
-
RUBY_THREAD_VM_STACK_SIZE:线程创建时使用的虚拟机堆栈大小。默认值:128KB(32 位 CPU)或 256KB(64 位 CPU)。
-
RUBY_THREAD_MACHINE_STACK_SIZE:线程创建时使用的机器堆栈大小。默认值:512KB 或 1024KB。
-
RUBY_FIBER_VM_STACK_SIZE:纤程创建时使用的虚拟机堆栈大小。默认值:64KB 或 128KB。
-
RUBY_FIBER_MACHINE_STACK_SIZE:纤程创建时使用的机器堆栈大小。默认值:256KB 或 512KB。
这些变量仅在启动时检查。
-
-
添加了常量 DEFAULT_PARAMS 来获取上述默认参数。
-
-
-
添加了方法
-
添加了
Signal.signame
,它返回信号名称
-
-
不兼容的变更
-
当指定 :SEGV、:BUS、:ILL、:FPE、:VTALRM 时,
Signal.trap
会引发ArgumentError
。
-
-
-
-
添加了方法
-
添加了
String#b
,它返回一个编码为 ASCII-8BIT 的字符串副本。
-
-
更改返回值
-
String#lines
现在返回一个数组而不是枚举器。 -
String#chars
现在返回一个数组而不是枚举器。 -
String#codepoints
现在返回一个数组而不是枚举器。 -
String#bytes
现在返回一个数组而不是枚举器。
-
-
-
-
添加了方法
-
添加了
Struct#to_h
,它返回与实例变量名称对应的键的值。
-
-
-
-
添加了方法
-
添加了
Thread#thread_variable_get
,用于获取线程局部变量(这些变量与Fiber
局部变量不同)。 -
添加了
Thread#thread_variable_set
,用于设置线程局部变量。 -
添加了
Thread#thread_variables
,用于获取线程局部变量键的列表。 -
添加了
Thread#thread_variable?
,用于测试是否已设置特定的线程变量。 -
添加了
Thread.handle_interrupt
以及实例方法和单例方法 pending_interrupt?,用于异步处理异常 -
添加了
Thread#backtrace_locations
,它返回类似于Kernel#caller_locations
的信息。
-
-
新类
Thread::Backtrace::Location
用于保存回溯位置信息。这些信息由Thread#backtrace_locations
和Kernel#caller_locations
返回。 -
不兼容的变更
-
如果目标线程是当前线程或主线程,
Thread#join
和Thread#value
现在会引发ThreadError
。
-
-
-
-
更改返回值
-
Time#to_s
现在返回 US-ASCII 编码,而不是 BINARY。
-
-
-
-
新类。此类是 set_trace_func 的替代品。易于使用且实现高效。
-
-
顶层
-
添加了方法
-
添加了 main.define_method,它定义了一个全局函数。
-
添加了 main.using,它将改进导入到当前文件或 eval 字符串。[实验性]
-
-
核心类兼容性问题(不包括功能错误修复)¶ ↑
-
请参见上面。
-
这些方法不再返回
Enumerator
,但为了向后兼容,仍然支持传递块。像 str.lines.with_index(1) { |line, lineno| … } 这样的代码不再起作用,因为 str.lines 返回一个数组。在这种情况下,请将 lines 替换为 each_line。
-
IO#lines
-
IO#chars
-
IO#codepoints
-
IO#bytes
-
ARGF#lines
-
ARGF#chars
-
ARGF#bytes
-
StringIO#lines
-
StringIO#chars
-
StringIO#codepoints
-
StringIO#bytes
-
Zlib::GzipReader#lines
-
Zlib::GzipReader#bytes
这些方法已被弃用,建议使用 each_line、each_byte、each_char 和 each_codepoint。
-
这些方法已被删除。只有当两个 Proc 对象是同一个对象时,它们才相等 (==)。
-
Fixnum
-
Bignum
-
Fixnum、Bignum 和 Float 对象被冻结。
-
请参见上面。
-
合并 Onigmo。 github.com/k-takata/Onigmo
-
system() 和 exec() 的 :close_others 选项默认值为 true。此外,所有新的文件描述符默认都设置了 close-on-exec 标志。这意味着文件描述符不会继承给派生的进程,除非明确请求,例如 system(…, fd=>fd)。
-
除非第二个参数为 true,否则针对受保护方法的 Kernel#respond_to? 现在返回 false。
-
Kernel#respond_to_missing?
-
Kernel#initialize_clone
-
Kernel#initialize_dup
这些方法现在是私有的。
-
请参见上面。
-
Mutex#lock, Mutex#unlock, Mutex#try_lock, Mutex#synchronize 和 Mutex#sleep
请参见上面。
Stdlib 更新(仅限未完成的更新)¶ ↑
-
cgi
-
添加了 HTML5 标签生成器。
-
CGI#header
已重命名为CGI#http_header
,并别名为CGI#header
。 -
当调用 HTML5 tagmaker 时,会覆盖
CGI#header
,CGI#header
函数用于创建 <header> 元素。
-
-
CSV
-
删除了 CSV::dump 和 CSV::load,以保护用户免受危险的序列化漏洞的侵害。
-
-
iconv
-
Iconv 已被删除。请改用
String#encode
。
-
-
io/console
-
新方法
-
添加了
IO#cooked
,它在给定代码块内将终端设置为 cooked 模式。 -
添加了
IO#cooked!
,它将终端设置为 cooked 模式。
-
-
扩展方法
-
-
io/wait
-
新功能
-
添加了
IO#wait_writable
方法。 -
添加了
IO#wait_readable
方法作为IO#wait
的别名。
-
-
-
json
-
更新到 1.7.7。
-
-
net/http
-
新功能
-
现在可以从 http_proxy 环境变量自动检测代理。有关详细信息,请参见
Net::HTTP::new
。 -
默认情况下,所有请求都将请求 gzip 和 deflate 压缩。有关详细信息,请参见
Net::HTTP
。 -
现在,对于单个实例,SSL 会话可以在连接之间重用。通过使用先前协商的会话来加快连接速度。
-
可以从
URI
创建请求,该请求设置请求的 uri 和请求的主机头(但不会更改连接到的主机)。 -
响应包含请求的
URI
,从而可以更轻松地实现重定向跟踪。
-
-
新方法
-
扩展方法
-
如果指定了 local_host 和 local_port,则
Net::HTTP#connect
会使用它们。
-
-
-
net/imap
-
新方法
-
Net::IMAP.default_port
-
Net::IMAP.default_imap_port
-
Net::IMAP.default_tls_port
-
Net::IMAP.default_ssl_port
-
Net::IMAP.default_imaps_port
-
-
-
objspace
-
openssl
-
当尝试编码 nil 值时,始终引发错误。现在,当在值是 nil 的实例上调用 to_der 时,所有
OpenSSL::ASN1::Primitive
的实例都会引发TypeError
。在相同的情况下,所有OpenSSL::ASN1::Constructive
的实例都会引发NoMethodError
。仍然允许构造此类值。 -
通过将 OpenSSL::SSL::SSLContext#ssl_version 设置为 :TLSv1_2、:TLSv1_2_server、:TLSv1_2_client 或 :TLSv1_1、:TLSv1_1_server :TLSv1_1_client 来支持 TLS 1.1 和 1.2。可以使用 OpenSSL::SSL#ssl_version 查询有效使用的版本。此外,还可以使用 OpenSSL::SSL::OP_NO_TLSv1_1 和 OpenSSL::SSL::OP_NO_TLSv1_2 将新的 TLS 版本列入黑名单。
-
添加了
OpenSSL::SSL::SSLContext#renegotiation_cb
。可以设置用户定义的回调,每当协商新的握手时都会调用该回调。这还允许以编程方式拒绝(客户端)重新协商尝试。 -
通过 OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS 支持 BEAST 缓解措施的记录的 “0/n” 分割。
-
OpenSSL::SSL::SSLContext
的默认选项已更改为 OpenSSL::SSL::OP_ALL & ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS,而不是仅 OpenSSL::SSL::OP_ALL。这默认启用了 BEAST 攻击的对策。 -
解密 PEM 编码的文件时,
OpenSSL
要求密码至少为四个字符长。这导致了尴尬的情况:可以使用少于四个字符的密码进行导出,但之后访问该文件会失败。OpenSSL::PKey::RSA
、OpenSSL::PKey::DSA
和OpenSSL::PKey::EC
现在在用密码将私钥导出到 PEM 时也强制执行相同的检查 - 它必须至少为四个字符长。 -
支持 Next Protocol Negotiation 扩展的 SSL/TLS 支持。
OpenSSL
1.0.1 及更高版本支持。 -
OpenSSL::OPENSSL_FIPS 允许客户端应用程序检测
OpenSSL
是否启用了 FIPS。OpenSSL.fips_mode=
允许手动打开和关闭 FIPS 模式,以适应 FIPS 模式成为明确要求的环境。 -
通过 Cipher#auth_data= 和 Cipher#auth_tag/Cipher#auth_tag= 支持带有关联
Data
(AEAD) 的身份验证加密。目前 (OpenSSL
1.0.1c),仅支持 GCM 模式。
-
-
ostruct
-
新方法
-
OpenStruct#[]
, []= -
OpenStruct#to_h
将结构体转换为哈希。
-
-
扩展方法
-
OpenStruct.new
也接受OpenStruct
/Struct
。
-
-
-
pathname
-
扩展方法
-
如果没有给出块,则
Pathname#find
返回一个枚举器。
-
-
-
rake
-
rake 已更新到 0.9.5 版本。
此版本向后兼容之前的 rake 版本,并包含许多错误修复。
有关 rake 0.9.3、0.9.4 和 0.9.5 中的更改列表,请参见 rake.rubyforge.org/doc/release_notes/rake-0_9_5_rdoc.html。
-
-
-
RDoc
已更新到 4.0 版本。此版本在很大程度上向后兼容之前的 rdoc 版本。最值得注意的更改是 ri 数据格式的更新(必须为跨 rdoc 版本共享的 gem 重新生成 ri 数据)。进一步的 API 更改是内部的,不会影响大多数用户。
值得注意的更改包括:
-
ri 的页面支持。尝试 'ri ruby:` 获取 ruby 中的页面列表,或 `ri ruby:syntax/literals` 获取文字的语法文档。
这也适用于 gem,例如 ‘ri rspec:README` 用于 rspec gem 的 README 文件。
-
Markdown 支持。有关详细信息,请参见 ri
RDoc::Markdown
。
有关 rdoc 4.0 中的完整更改列表,请参见 github.com/rdoc/rdoc/blob/master/History.rdoc。
-
-
-
resolv
-
新方法
-
Resolv::DNS::Config#timeouts=
-
-
rexml
-
REXML::Document#write 支持
Hash
参数。 -
REXML::Document#write 支持新的 :encoding 选项。它更改 XML 文档的编码。如果没有 :encoding 选项,则 XML 声明中的编码将用于 XML 文档编码。
-
-
RubyGems
-
更新到 2.0.0
RubyGems 2.0.0 具有以下改进:
-
改进了对随 ruby 2.0.0+ 一起提供的默认 gem 的支持。
-
gem 可以通过
Gem::Specification#metadata
具有任意元数据。 -
“gem search” 现在默认为 –remote,并且像 gem list 一样锚定。
-
添加了 –document 以替换 –rdoc 和 –ri。使用 –no-document 禁用文档,使用 –document=rdoc 仅生成 rdoc。
-
默认情况下,仅生成 ri 格式的文档。
-
“gem server” 使用
RDoc::Servlet
从RDoc
4.0 生成 HTML 文档。
有关更新和错误修复的扩展列表,请参见:github.com/rubygems/rubygems/blob/master/History.txt
-
-
-
shellwords
-
Shellwords#shellescape
现在使用 to_s 对给定对象进行字符串化。 -
Shellwords#shelljoin
接受给定数组中的非字符串对象,每个对象都使用 to_s 进行字符串化。
-
-
stringio
-
已弃用的方法
-
StringIO#lines、bytes、chars 和 codepoints 已被弃用。
-
-
-
syslog
-
添加了 Syslog::Logger,它在 Syslog 之上提供
Logger
API。 -
引入了 Syslog::Priority、Syslog::Level、Syslog::Option 和 Syslog::Macros,以便轻松检测正在运行的系统上的可用常量。
-
-
tmpdir
-
不兼容的变更
-
Dir.mktmpdir
使用FileUtils.remove_entry
而不是FileUtils.remove_entry_secure
。这意味着应用程序不应更改创建的临时目录的权限,以便其他用户可以写入。
-
-
-
yaml
-
Syck 已被删除。
YAML
现在完全依赖于已安装的 libyaml。 -
libyaml 现在与 ruby 捆绑在一起,以防该库未在本地安装。
-
-
zlib
-
添加了对
Zlib::Inflate
和Zlib::Deflate
的流式传输支持。这允许处理流,而无需使用大量内存。 -
添加了对新的 deflate 策略 Zlib::RLE 和 Zlib::FIXED 的支持。
-
现在,处理
Zlib
流时不会使用 GVL。这允许并行处理 gzip、zlib 和 deflate 流。 -
已弃用的方法
-
Zlib::GzipReader#lines 和 bytes 已被弃用。
-
-
标准库兼容性问题(不包括功能性错误修复)¶ ↑
-
OpenStruct
新增的方法可能会与名为 “each_pair”, “eql?”, “hash” 或 “to_h” 的自定义属性冲突。 -
Dir.mktmpdir
在 lib/tmpdir.rb 中。请参见上面。
C API 更新¶ ↑
-
添加了 NUM2SHORT() 和 NUM2USHORT()。它们与 NUM2INT 类似,但是是 short 类型。
-
添加了 rb_newobj_of() 和 NEWOBJ_OF()。它们会创建一个给定类的新对象。