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”的纤程。
-
-
-
-
扩展方法
-
File.fnmatch?
现在如果给出 File::FNM_EXTGLOB 选项,将在模式中扩展大括号。
-
-
-
-
改进
-
引入了位图标记,它抑制了使用写时复制复制内存页。
-
引入了非递归标记,避免了意外的堆栈溢出。
-
-
-
-
添加了方法
-
添加了
GC::Profiler.raw_data
,它返回GC
的原始配置文件数据。
-
-
-
-
添加了方法
-
添加了
Hash#to_h
作为显式转换方法,类似于Array#to_a
。
-
-
扩展方法
-
Hash#default_proc=
可以传递 nil 来清除默认过程。
-
-
-
-
弃用方法
-
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#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#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
-
移除 CSV::dump 和 CSV::load,以保护用户免受危险的序列化漏洞。
-
-
iconv
-
Iconv 已被移除。请使用
String#encode
代替。
-
-
io/console
-
新方法
-
添加了 IO#cooked,它在给定块内将终端设置为 cooked 模式。
-
添加了 IO#cooked!,它将终端设置为 cooked。
-
-
扩展方法
-
IO#raw、IO#raw! 和 IO#getch 接受关键字参数 :min 和 :time。
-
-
-
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设置请求的request_uri和host头(但不改变连接到的主机)。
-
响应包含请求的URI,这使得重定向跟踪的实现更加容易。
-
-
新方法
-
Net::HTTP#local_host
-
Net::HTTP#local_host=
-
Net::HTTP#local_port
-
Net::HTTP#local_port=
-
-
扩展方法
-
如果指定了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
-
新方法
-
ObjectSpace.reachable_objects_from(obj)
-
-
-
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#[], []=
-
OpenStruct#each_pair
-
OpenStruct#eql?
-
OpenStruct#hash
-
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#timeouts=
-
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::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”的自定义属性冲突。
-
lib/tmpdir.rb 中的 Dir.mktmpdir
见上文。
C API 更新¶ ↑
-
添加了 NUM2SHORT() 和 NUM2USHORT()。它们类似于 NUM2INT,但更短。
-
添加了 rb_newobj_of() 和 NEWOBJ_OF()。它们创建给定类的新的对象。