NEWS for Ruby 2.0.0¶ ↑
本文件列出了版本之间用户可见的功能更改,不包括错误修复。
请注意,每个条目都非常简短,没有提供任何原因或参考信息。有关所有完整信息的变化列表,请参阅 ChangeLog 文件。
自 1.9.3 版本以来的更改¶ ↑
语言变更¶ ↑
-
添加了关键字参数。
-
添加了 %i 和 %I 用于创建符号列表(类似于 %w 和 %W)。
-
默认源编码更改为 UTF-8。(以前是 US-ASCII)
-
不再警告以 ‘_’ 开头的未使用变量。
核心类更新(仅突出显示的更新)¶ ↑
-
-
添加了方法
-
添加了 ARGF#codepoints 和
ARGF#each_codepoint
,类似于IO
的对应方法。
-
-
-
-
添加了方法
-
添加了
Array#bsearch
用于二分查找。
-
-
不兼容的更改
-
Array#shuffle!
和Array#sample
的随机参数现在将使用一个参数调用,即最大值。 -
当给出
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.fnmatch?
现在如果给出 File::FNM_EXTGLOB 选项,将在模式中扩展大括号。
-
-
-
-
改进
-
引入了位图标记,它抑制了使用写时复制复制内存页。
-
引入了非递归标记,避免了意外的堆栈溢出。
-
-
-
-
添加了方法
-
添加了
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
-
添加了方法
-
添加了
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?,它返回互斥锁是否由当前线程持有。[实验性]
-
-
不兼容的更改
-
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: 线程创建时使用的 VM 堆栈大小。默认值:128KB(32 位 CPU)或 256KB(64 位 CPU)。
-
RUBY_THREAD_MACHINE_STACK_SIZE: 线程创建时使用的机器堆栈大小。默认值:512KB 或 1024KB。
-
RUBY_FIBER_VM_STACK_SIZE: 纤程创建时使用的 VM 堆栈大小。默认值:64KB 或 128KB。
-
RUBY_FIBER_MACHINE_STACK_SIZE: 纤程创建时使用的机器堆栈大小。默认值: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,它将细化导入到当前文件或 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)。
-
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::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
创建请求,这将设置请求的 request_uri 和 host 标头(但不更改连接到的主机)。 -
响应包含请求的
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
-
-
-
对象空间
-
openssl
-
在尝试对 nil 值进行编码时始终抛出错误。所有
OpenSSL::ASN1::Primitive
实例现在在对值为 nil 的实例调用 to_der 时都会抛出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 支持记录的“0/n”拆分作为 BEAST 缓解措施。
-
OpenSSL::SSL::SSLContext
的默认选项已更改为 OpenSSL::SSL::OP_ALL & ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS,而不是仅 OpenSSL::SSL::OP_ALL。这默认情况下启用了针对 BEAST 攻击的对策。 -
OpenSSL
要求用于解密 PEM 编码文件的密码至少为四个字符长。这导致了尴尬的情况,即可以使用少于四个字符的密码进行导出,但随后访问文件失败。因此,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= 支持带关联数据的认证加密 (AEAD)。目前(
OpenSSL
1.0.1c),仅支持 GCM 模式。
-
-
ostruct
-
新方法
-
扩展方法
-
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 数据格式的更新(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 文档。
有关更新和错误修复的扩展列表,请参阅: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
添加了流支持。这允许处理流,而无需使用大量内存。 -
添加了对新的压缩策略 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,但更短。
-
添加了 rb_newobj_of() 和 NEWOBJ_OF()。它们创建给定类的新的对象。