NEWS Ruby 2.1.0
本文档是除 bug 修复之外,在版本发布之间所做的用户可见功能更改的列表。
请注意,每个条目都保持得非常简短,没有提供原因或参考信息。有关所有信息的完整更改列表,请参阅 ChangeLog 文件。
自 2.0.0 版本以来的变更
语言更改
-
现在可以省略关键字参数的默认值。这些“必需的关键字参数”需要在调用时显式提供。
-
为整数和浮点数文字添加了后缀:‘r’、‘i’ 和 ‘ri’。
-
“42r” 和 “3.14r” 分别被求值为 Rational(42, 1) 和 3.14.rationalize。但带有 ‘r’ 后缀的指数形式,如 “6.022e+23r”,由于具有误导性而不被接受。
-
“42i” 和 “3.14i” 分别被求值为 Complex(0, 42) 和 Complex(0, 3.14)。
-
“42ri” 和 “3.14ri” 分别被求值为 Complex(0, 42r) 和 Complex(0, 3.14r)。
-
-
def-expr 现在返回其名称的符号而不是 nil。
核心类更新(仅列出重要的更新)
-
-
新方法
-
Array#to_h将键值对数组转换为Hash。
-
-
-
-
新方法
-
Enumerable#to_h将键值对列表转换为Hash。
-
-
-
-
新方法
-
Exception#cause提供在引发新异常时捕获的前一个异常。
-
-
-
-
改进
-
引入了分代
GC,也称为 RGenGC。
-
-
添加了环境变量
-
RUBY_GC_HEAP_INIT_SLOTS
-
RUBY_GC_HEAP_FREE_SLOTS
-
RUBY_GC_HEAP_GROWTH_FACTOR
-
RUBY_GC_HEAP_GROWTH_MAX_SLOTS
-
RUBY_GC_MALLOC_LIMIT_MAX
-
RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR
-
RUBY_GC_OLDMALLOC_LIMIT
-
RUBY_GC_OLDMALLOC_LIMIT_MAX
-
RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR
-
-
已弃用环境变量
-
RUBY_FREE_MIN(改用 RUBY_GC_HEAP_FREE_SLOTS)
-
RUBY_HEAP_MIN_SLOTS(改用 RUBY_GC_HEAP_INIT_SLOTS)
-
-
-
-
新方法
-
Fixnum#bit_length
-
Bignum#bit_length
-
-
Bignum 性能改进
-
如果可用,则使用 GMP。GMP 仅用于几种操作:乘法、除法、基数转换、GCD
-
-
-
-
扩展方法
-
IO#seek将 SEEK_DATA 和 SEEK_HOLE 作为 whence 参数。 -
IO#seek接受符号(:CUR、:END、:SET、:DATA、:HOLE)作为第二个参数。 -
IO#read_nonblock接受可选的 `exception: false` 以返回符号 -
IO#write_nonblock接受可选的 `exception: false` 以返回符号
-
-
-
-
新方法
-
Kernel#singleton_method
-
-
-
Module
-
新方法
-
Module#using,它仅在当前类或模块定义中激活指定模块的 refinement。 -
Module#singleton_class?如果接收者是单例类,则返回 true,如果它是普通类或模块,则返回 false。
-
-
扩展方法
-
Module#refine不再是实验性的。 -
Module#include和Module#prepend现在是公共方法。
-
-
-
Mutex
-
杂项
-
Mutex#owned? 不再是实验性的。
-
-
-
-
扩展方法
-
Numeric#step允许省略 limit 参数,在这种情况下会生成一个无限的数字序列。引入了关键字参数 ‘to` 和 `by` 以方便使用。`by` 可以是 0,在这种情况下将无限生成相同的值。
-
-
-
Process
-
新方法
-
替代 $0/$0= 的方法
-
Process.argv0()返回 $0 的原始值。 -
Process.setproctitle()设置进程标题而不影响 $0。
-
-
-
-
-
“literal”.freeze 现在被优化为返回相同的对象
-
新方法
-
String#scrub和String#scrub!验证并修复无效的字节序列。如果您想在旧版 Ruby 中使用此功能,请考虑使用 string-scrub.gem。
-
-
-
-
所有符号现在都被 frozen。
-
-
pack/unpack (Array/String)
-
Q! 和 q! 指令用于 long long 类型(如果平台支持该类型)。
-
-
顶层
-
扩展方法
-
main.using 不再是实验性的。该方法激活参数模块的祖先中的 refinement,以通过
Module#include支持 refinement 继承。
-
-
核心类的兼容性问题(不包括功能 bug 修复)
-
-
不兼容的更改
-
Hash#reject在未来的版本中将返回普通的Hash对象,即原始对象的子类、实例变量、默认值和受污染性将不再被复制,因此现在在使用此类Hash调用时会发出警告。
-
-
-
-
不兼容的更改
-
如果外部编码是 ASCII-8BIT,则 open 会忽略内部编码。
-
-
-
Kernel#eval、Kernel#instance_eval 和Module#module_eval。-
复制原始环境的作用域信息,这意味着 private、protected、public 和不带参数的 module_function 不会影响 eval 字符串外部的环境。例如,‘class Foo; eval “private”; def foo; end; end’ 不会将 Foo#foo 设置为 private。
-
-
Kernel#untrusted?、untrust 和 trust
-
这些方法已被弃用,并且其行为与 tainted?、taint 和 untaint 分别相同。如果 $VERBOSE 为 true,它们会显示警告。
-
-
-
单例类的祖先现在包括单例类,特别是其本身。
-
-
Module#define_method和Object#define_singleton_method-
现在它们返回已定义方法的符号,而不是方法/proc 本身。
-
-
-
如果接收者没有 to_r 方法,则引发
TypeError而不是ArgumentError。
-
-
-
从 lambda proc 返回现在总是退出
Proc,而不是退出创建 lambda 的方法。从非 lambda proc 返回会退出方法,与之前的行为相同。
-
* If invalid: :replace is specified for String#encode, replace invalid byte sequence even if the destination encoding equals to the source encoding.
标准库更新(仅列出重要的更新)
-
CGI::Util
-
所有类方法都已模块化。
-
-
-
扩展方法
-
Digest::Class.file接受构造函数的可选参数
-
-
-
Matrix
-
添加了 Vector#cross_product。
-
-
Net::SMTP
-
添加了 Net::SMTP#rset 来实现 RSET 命令
-
-
objspace
-
新方法
-
-
-
扩展方法
-
OpenSSL::BN.new允许 Fixnum/Bignum 参数。
-
-
-
open-uri
-
支持具有相同字段名称的多个字段(如 Set-Cookie)。
-
-
rake
-
已更新至 10.1.0。主要变更是移除了类命名空间、用于保存 rake DSL 方法的 Rake::DSL 以及移除了对旧版 rake 功能的支持。
有关自 rake 0.9.6 以来的完整变更列表,请参阅
-
-
-
新增常量
-
添加了 RbConfig::SIZEOF 以提供 C 类型的大小。
-
-
-
RDoc
-
已更新至 4.1.0。主要增强功能包括修改后的默认模板
-
和可访问性增强。
有关次要增强和错误修复的列表,请参阅:github.com/rdoc/rdoc/blob/v4.1.0.preview.1/History.rdoc
-
-
-
新方法
-
Resolv::DNS.fetch_resource
-
-
一次性多播 DNS 支持
-
支持 LOC 资源
-
-
REXML::Parsers::SAX2Parser
-
修复了 entitydecl 事件的参数数量错误。事件文档说“实体声明的数组”,但实现传递了两个或多个参数。这是一个实现错误,但它会破坏向后兼容性。
-
-
REXML::Parsers::StreamParser
-
支持“entity”事件。
-
-
REXML::Text
-
REXML::Text#<< 支持方法链,如 ‘text << “XXX” << “YYY”’。
-
REXML::Text#<< 支持非“原始”模式。
-
-
Rinda::RingServer, Rinda::RingFinger
-
Rinda 现在支持多播套接字。有关详细信息,请参阅 Rinda::RingServer 和 Rinda::RingFinger。
-
-
RubyGems
-
已更新至 2.2.0。值得注意的新功能包括
-
Gemfile 或 gem.deps.rb 支持(包括 Gem.file.lock)(实验性)
-
改进的、迭代的解析器(与 RubyGems 2.1 及更早版本相比)
-
支持跨 Ruby 平台和版本共享 GEM_HOME
有关增强功能和错误修复的完整列表,请参阅:github.com/rubygems/rubygems/tree/master/History.txt
-
-
-
Set
-
-
扩展方法
-
StringScanner#[]支持命名捕获。
-
-
-
Syslog::Logger
-
添加了 facility。
-
-
-
新方法
-
-
-
默认情况下,退出给定块的异常不再能在块内捕获,除非明确指定了异常类。
-
-
WEBrick
-
响应体现在可以是
StringIO或其他响应 readpartial 和 read 的 IO 类。
-
-
XMLRPC::Client
-
新方法
-
XMLRPC::Client#http。它返回
Net::HTTP作为客户端。通常,它不需要。当您想更改次要 HTTP 客户端选项时,它很有用。您可以通过 XMLRPC::Client 方法更改主要 HTTP 客户端选项。您应该使用 XMLRPC::Client 方法来更改主要 HTTP 客户端选项,而不是 XMLRPC::Client#http。
-
-
标准库兼容性问题(不包括功能 bug 修复)
-
Set
-
不兼容的更改
-
Set#to_set现在返回 self 而不是生成副本。
-
-
-
-
不兼容的更改
-
URI.decode_www_form遵循当前的 WHATWG URL 标准。它获取 encoding 参数来指定字符编码。它现在允许松散的百分比编码字符串,但拒绝 ;-separator。 -
URI.encode_www_form遵循当前的 WHATWG URL 标准。它获取 encoding 参数以在百分比编码之前进行转换。默认情况下,UTF-16 字符串不会在百分比编码前转换为 UTF-8。
-
-
-
curses
-
已移除。curses 现在可作为 gem 使用。有关详细信息,请参阅 rubygems.org/gems/curses。
-
内置全局变量兼容性问题
-
$SAFE
-
$SAFE=4 已过时。如果 $SAFE 设置为 4 或更大,则会引发
ArgumentError。
-
C API 更新
-
rb_gc_set_params() 已弃用。这仅在 Ruby 内部使用。
-
添加了 rb_gc_count()。此函数返回
GC发生的次数。 -
添加了 rb_gc_stat()。这允许从 C 访问特定的
GC.stat()值,而没有分配开销。 -
添加了 rb_gc_latest_gc_info()。这允许访问
GC.latest_gc_info()。 -
添加了 rb_postponed_job_register()。它接受一个函数回调,该回调在 VM 处于一致状态时调用,即执行来自 C 信号处理程序的工作。
-
添加了 rb_profile_frames()。提供对当前 ruby 堆栈的低成本访问,用于调用堆栈分析。
-
rb_tracepoint_new() 支持仅从 C 访问的新内部事件
-
RUBY_INTERNAL_EVENT_NEWOBJ
-
RUBY_INTERNAL_EVENT_FREEOBJ
-
RUBY_INTERNAL_EVENT_GC_START
-
RUBY_INTERNAL_EVENT_GC_END_MARK
-
RUBY_INTERNAL_EVENT_GC_END_SWEEP
-
请注意,您*不能*同时指定“内部事件”和普通事件(如 RUBY_EVENT_CALL、RUBY_EVENT_RETURN)。
-