NEWS Ruby 2.0.0
本文档是除 bug 修复之外,在版本发布之间所做的用户可见功能更改的列表。
请注意,每个条目都保持得非常简短,没有提供原因或参考信息。有关所有信息的完整更改列表,请参阅 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”的 fiber。
-
-
-
-
扩展方法
-
如果提供了 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)。
-
对受保护方法的 respond_to? 现在返回 false,除非第二个参数为 true。
-
__callee__ 已恢复到原始行为,现在返回已调用的名称,而不是别名方法中的原始名称。
-
Kernel#inspect 不再调用 to_s(它曾经调用重新定义的 to_s)。
-
-
-
-
添加了方法
-
添加了
LoadError#path方法,用于返回无法加载的文件名。
-
-
-
Module
-
添加了方法
-
添加了
Module#prepend,它类似于Module#include,但 prepended 模块中的方法会覆盖 prepending 模块中的相应方法。 -
添加了
Module.prepended和Module.prepend_features,类似于 included 和 append_features。 -
添加了
Module#refine,用于在本地扩展类或模块。[实验性]
-
-
扩展方法
-
Module#define_method接受来自模块的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 是同一个对象时,它们才相等。
-
-
-
Process
-
添加了方法
-
添加了 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:创建线程时使用的 vm 堆栈大小。默认值:128KB(32 位 CPU)或 256KB(64 位 CPU)。
-
RUBY_THREAD_MACHINE_STACK_SIZE:创建线程时使用的机器堆栈大小。默认值:512KB 或 1024KB。
-
RUBY_FIBER_VM_STACK_SIZE:创建 fiber 时使用的 vm 堆栈大小。默认值:64KB 或 128KB。
-
RUBY_FIBER_MACHINE_STACK_SIZE:创建 fiber 时使用的机器堆栈大小。默认值:256KB 或 512KB。
这些变量仅在启动时检查。
-
-
添加了常量 DEFAULT_PARAMS 以获取上述默认参数。
-
-
-
添加了方法
-
添加了
Signal.signame,它返回信号名称
-
-
不兼容的更改
-
Signal.trap在指定 :SEGV、:BUS、:ILL、:FPE、:VTALRM 时引发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,它将 refinements 导入当前文件或 eval 字符串。[实验性]
-
-
核心类的兼容性问题(不包括功能 bug 修复)
-
见上文。
-
这些方法不再返回
Enumerator,尽管出于向后兼容性,仍然支持传递块。类似 str.lines.with_index(1) { |line, lineno| … } 的代码不再有效,因为 str.lines 返回一个数组。在这种情况下,请用 each_line 替换 lines。
-
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
-
Fixnums、Bignums 和 Floats 已被冻结。
-
见上文。
-
合并 Onigmo。github.com/k-takata/Onigmo
-
system() 和 exec() 的 :close_others 选项默认设置为 true。此外,所有新的文件描述符默认都设置了 close-on-exec 标志。这意味着文件描述符不会传递给子进程,除非显式请求,例如 system(…, fd=>fd)。
-
对受保护方法的 Kernel#respond_to? 现在返回 false,除非第二个参数为 true。
-
Kernel#respond_to_missing?
-
Kernel#initialize_clone
-
Kernel#initialize_dup
这些方法现在是私有的。
-
见上文。
-
Mutex#lock、Mutex#unlock、Mutex#try_lock、Mutex#synchronize 和 Mutex#sleep
见上文。
标准库更新(仅列出重要的更新)
-
cgi
-
添加 HTML5 标签生成器。
-
CGI#header 已重命名为 CGI#http_header 并别名为 CGI#header。
-
当调用 HTML5 标签生成器时,它会覆盖 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,这使得实现重定向跟踪更加容易。
-
-
新方法
-
扩展方法
-
Net::HTTP#connect 使用指定的 local_host 和 local_port。
-
-
-
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 值时始终引发错误。
OpenSSL::ASN1::Primitive的所有实例在调用 to_der 处理值为 nil 的实例时现在都引发TypeError。在相同情况下,OpenSSL::ASN1::Constructive的所有实例都引发NoMethodError。仍然允许构造此类值。 -
TLS 1.1 和 1.2 支持,方法是设置 OpenSSL::SSL::SSLContext#ssl_version 为 :TLSv1_2、:TLSv1_2_server、:TLSv1_2_client 或 :TLSv1_1、:TLSv1_1_server :TLSv1_1_client。通过 OpenSSL::SSL#ssl_version 可以查询有效使用的版本。此外,还可以使用 OpenSSL::SSL::OP_NO_TLSv1_1 和 OpenSSL::SSL::OP_NO_TLSv1_2 来阻止新的 TLS 版本。
-
添加了
OpenSSL::SSL::SSLContext#renegotiation_cb。可以设置用户定义的 callback,在每次协商新的握手时调用。这还允许以编程方式拒绝(客户端)重新协商尝试。 -
通过 OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS 支持记录的“0/n”拆分,作为 BEAST 缓解措施。
-
OpenSSL::SSL::SSLContext的默认选项已从仅 OpenSSL::SSL::OP_ALL 更改为 OpenSSL::SSL::OP_ALL & ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS。这默认启用了针对 BEAST 攻击的对策。 -
OpenSSL要求用于解密 PEM 编码文件的密码至少为四位长。这导致了令人尴尬的情况,即可以使用少于四位字符的密码进行导出,但之后访问文件失败。因此,OpenSSL::PKey::RSA、OpenSSL::PKey::DSA和OpenSSL::PKey::EC现在在使用密码将私钥导出到 PEM 时强制执行相同的检查——密码必须至少为四位长。 -
SSL/TLS 支持 Next Protocol Negotiation 扩展。支持 OpenSSL 1.0.1 及更高版本。
-
OpenSSL::OPENSSL_FIPS 允许客户端应用程序检测
OpenSSL是否启用了 FIPS。OpenSSL.fips_mode=允许手动打开和关闭 FIPS 模式,以便适应 FIPS 模式是明确要求的情况。 -
通过 Cipher#auth_data= 和 Cipher#auth_tag/Cipher#auth_tag= 支持使用关联数据的认证加密 (AEAD)。当前(
OpenSSL1.0.1c),仅支持 GCM 模式。
-
-
ostruct
-
新方法
-
OpenStruct#[], []=
-
OpenStruct#each_pair
-
OpenStruct#to_h 将结构转换为哈希。
-
-
扩展方法
-
OpenStruct.new也接受OpenStruct/Struct。
-
-
-
pathname
-
扩展方法
-
如果未给出块,
Pathname#find将返回一个枚举器。
-
-
-
rake
-
rake 已更新至版本 0.9.5。
此版本与之前的 rake 版本向后兼容,并包含许多 bug 修复。
请参阅 rake.rubyforge.org/doc/release_notes/rake-0_9_5_rdoc.html 查看 rake 0.9.3、0.9.4 和 0.9.5 的更改列表。
-
-
RDoc
-
RDoc 已更新至版本 4.0
此版本与之前的 rdoc 版本在很大程度上向后兼容。最值得注意的更改是 ri 数据格式的更新(ri 数据必须为跨 rdoc 版本共享的 gem 重新生成)。其他 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 4.0 的 RDoc::Servlet 来生成 HTML 文档。
有关更新和 bug 修复的扩展列表,请参阅: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 已弃用。
-
-
标准库兼容性问题(不包括功能 bug 修复)
-
OpenStruct的新方法可能会与命名为“each_pair”、“eql?”、“hash”或“to_h”的自定义属性冲突。 -
Dir.mktmpdir在 lib/tmpdir.rb 中见上文。
C API 更新
-
已添加 NUM2SHORT() 和 NUM2USHORT()。它们类似于 NUM2INT,但长度较短。
-
已添加 rb_newobj_of() 和 NEWOBJ_OF()。它们会创建给定类的对象。