NEWS for Ruby 2.4.0
本文档是除 bug 修复之外,在版本发布之间所做的用户可见功能更改的列表。
请注意,每个条目都非常简短,没有提供原因或参考信息。要获取包含所有足够信息的更改的完整列表,请参阅 ChangeLog 文件或 Redmine(例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER)
自 2.3.0 版本以来的变化
语言更改
-
现在允许在条件表达式中使用多重赋值。[Feature #10617]
-
通过
Symbol#to_proc在方法中启用 Refinements。[Feature #9451] -
Refinements 已与 Kernel#send 和
BasicObject#__send__一起启用。[Feature #11476] -
Rescue 修饰符现在可应用于方法参数。[Feature #12686]
-
现在允许顶层 return。[Feature #4840]
核心类更新(仅列出重要的更新)
-
-
Array#concat[Feature #12333]现在接受多个参数。
-
Array#max和Array#min。[Feature #12172]这可能会导致轻微的不兼容:如果您重新定义了
Enumerable#max并对Array调用 max,您的重新定义现在将被忽略。您还应该重新定义Array#max。 -
Array#pack[Feature #12754]现在接受可选参数 ‘buffer:’ 来重用已分配的缓冲区。
-
Array#sum[Feature #12217]与
Enumerable#sum不同之处在于,Array#sum不依赖于 each 方法的定义。
-
-
-
Comparable#clamp。[Feature #10594]
-
-
-
Dir.empty?。[Feature #10121]
-
-
-
不带块的
Enumerable#chunk现在返回一个Enumerator[Feature #2172] -
Enumerable#sum[Feature #12217] -
Enumerable#uniq[Feature #11090]
-
-
-
Enumerator::Lazy#chunk_while[GH-1186] -
Enumerator::Lazy#uniq[Feature #11090]
-
-
-
File.empty?。[Feature #9969]
-
-
-
Float#ceil、Float#floor和Float#truncate现在接受一个可选的 digits 参数,Float#round也是如此。[Feature #12245] -
Float#round现在接受一个可选的关键字参数 half,默认行为是向上舍入。[Bug #12548] [Bug #12958] half 参数可以是 :even、:up 和 :down 之一。[Feature #12953]
-
-
-
Hash#compact和Hash#compact![Feature #11818] -
Hash#transform_values和Hash#transform_values![Feature #12512]
-
-
-
Fixnum 和 Bignum 被统一到
Integer中[Feature #12005] -
Integer#ceil、Integer#floor和Integer#truncate现在接受一个可选的 digits 参数,Integer#round也是如此。[Feature #12245] -
Integer#digits用于提取位值表示法中的数字[Feature #12447] -
Integer#round现在接受一个可选的关键字参数 half,默认行为是向上舍入。[Bug #12548] [Bug #12958]half 参数可以是 :even、:up 和 :down 之一。[Feature #12953]
-
-
-
IO#gets、IO#readline、IO#each_line、IO#readlines、IO.foreach现在接受一个可选的关键字参数 chomp。[Feature #12553]
-
-
-
Kernel#clone现在接受一个可选的关键字参数 freeze。[Feature #12300]
-
-
-
MatchData#named_captures[Feature #11999] -
MatchData#values_at支持命名捕获[Feature #9179]
-
-
Module
-
现在
Module#refine接受一个模块作为参数。[Feature #12534] -
Module.used_modules[Feature #7418]
-
-
-
Numeric#finite?,Numeric#infinite?[Feature #12039]
-
-
Process
-
支持 macOS 10.12 中引入的 CLOCK_MONOTONIC_RAW_APPROX、CLOCK_UPTIME_RAW 和 CLOCK_UPTIME_RAW_APPROX。
-
-
-
Rational#round现在接受一个可选的关键字参数 half,默认行为是向上舍入。[Bug #12548] [Bug #12958] half 参数可以是 :even、:up 和 :down 之一。[Feature #12953]
-
-
-
元字符 X 匹配 Unicode 9.0 字符,并对 UTR #51 Unicode Emoji, Version 4.0 emoji zwj 序列进行了一些修复。
-
Regexp#match?[Feature #8110]此方法返回布尔值,不保存反向引用。
-
更新至 Onigmo 6.0.0。
-
-
Regexp/String:将 Unicode 版本从 8.0.0 更新到 9.0.0 [Feature #12513]
-
RubyVM::Env
-
RubyVM::Env 已移除。
-
-
-
String#casecmp?[Feature #12786] -
String#concat,String#prepend[Feature #12333]现在接受多个参数。
-
String#each_line,String#lines现在接受一个可选的关键字参数 chomp。[Feature #12553] -
String#match?[Feature #12898] -
String#unpack1[Feature #12752] -
String#upcase,String#downcase,String#capitalize,String#swapcase及其对应的 bang 方法适用于所有 Unicode 字符,不再仅限于 ASCII。支持的编码包括 UTF-8、UTF-16BE/LE、UTF-32BE/LE 和 ISO-8859-1~16。可以通过选项获得变体。详情请参阅String#downcase的文档。[Feature #10085] -
String.new(capacity: size) [Feature #12024]
-
-
-
StringIO#gets,StringIO#readline,StringIO#each_line,StringIO#readlines现在接受一个可选的关键字参数 chomp。[Feature #12553]
-
-
-
Symbol#casecmp?[Feature #12786] -
Symbol#match现在返回MatchData。[Bug #11991] -
Symbol#match?[Feature #12898] -
Symbol#upcase,Symbol#downcase,Symbol#capitalize, 和Symbol#swapcase现在适用于所有 Unicode。详情请参阅String#downcase的文档。[Feature #10085]
-
-
-
Thread#report_on_exception和Thread.report_on_exception[Feature #6647]
-
-
-
TracePoint#callee_id[Feature #12747]
-
-
-
引入了一个名为
Warning的新模块。默认情况下,它只有一个名为 warn 的单例方法。这使得第三方库能够控制警告的处理方式。[Feature #12299]
-
标准库更新(仅列出重要的更新)
-
-
不允许使用 , 作为分隔符[Bug #12791]
-
-
CSV
-
添加 liberal_parsing 选项。[Feature #11839]
-
-
-
IPAddr#==和IPAddr#<=>在强制类型转换失败时不再引发异常。[Bug #12799]
-
-
IRB
-
Binding#irb:像 `binding.pry` 一样启动 REPL 会话,在 r56624 引入。
-
-
Logger
-
允许在构造函数中指定 logger 参数,如 level、progname、datetime_format、formatter。[Feature #12224]
-
添加 shift_period_suffix 选项。[Feature #10772]
-
-
-
新方法:
Net::HTTP.post[Feature #12375]
-
-
Net::FTP
-
支持 TLS (RFC 4217)。
-
为 Net::FTP.new 支持 hash 风格的选项。
-
为 Net::FTP#status 添加了一个新的可选参数 pathname。由 soleboxy 贡献。[GH-1478] [Feature #12965]
-
-
-
包含 Ruby/OpenSSL 2.0。
OpenSSL已作为 Gem 提取,并维护在一个单独的存储库中:github.com/ruby/openssl。它仍然是一个“默认 gem”。[Feature #9612] 有关完整的发布说明,请参阅 ext/openssl/History.md。
-
-
optparse
-
添加 into 选项。[Feature #11191]
-
-
pathname
-
新方法:
Pathname#empty?[Feature #12596]
-
-
Readline
-
Readline.quoting_detection_proc 和 Readline.quoting_detection_proc=[Feature #12659]
-
-
REXML
-
set
-
新方法:
Set#compare_by_identity和Set#compare_by_identity?。[Feature #12210]
-
-
WEBrick
-
不允许使用 , 作为分隔符[Bug #12791]
-
兼容性问题(不包括功能性 bug 修复)
-
实现了
Array#sum和Enumerable#sum。[Feature #12217]Ruby 本身没有兼容性问题,因为 Ruby 在 Ruby 2.4 之前没有为数组提供 sum 方法。然而,许多第三方 gem,如 activesupport、facets、simple_stats 等,都定义了 sum 方法。这些实现大部分是兼容的,但存在细微的差异。Ruby 的 sum 方法大部分应该是兼容的,但无法与所有这些方法完美兼容。
-
Fixnum 和 Bignum 被统一到
Integer中[Feature #12005]Fixnum 类和 Bignum 类已被移除。
Integer类已从抽象类更改为具体类。例如,0 是 Integer 的实例:0.class 返回Integer。常量 Fixnum 和 Bignum 已绑定到Integer。因此 obj.kind_of?(Fixnum) 的行为与 obj.kind_of?(Integer) 相同。在 C 级别,Fixnum 对象和 Bignum 对象可以通过 FIXNUM_P(obj) 和 RB_TYPE_P(obj, T_BIGNUM) 来区分。RUBY_INTEGER_UNIFICATION 可用于在 C 级别检测此功能。0.class ==Integer可用于在 Ruby 级别检测此功能。C 级别常量 rb_cFixnum 和 rb_cBignum 已移除。它们可能导致编译失败。 -
String/Symbol#upcase/downcase/swapcase/capitalize(!) 现在适用于所有 Unicode,而不仅仅是 ASCII。[Feature #10085]
如果数据已经是 ASCII 格式,或者 ASCII 限制只是为了等待更广泛的实现,则不需要更改。在处理 Unicode 数据但操作必须仅限于 ASCII 的情况下,需要进行更改(使用 :ascii 选项)。国际化域名是一个很好的例子。
-
TRUE / FALSE / NIL
这些常量现在已废弃。[Feature #12574] 请分别使用 true / false / nil 替代。
标准库兼容性问题(不包括功能 bug 修复)
-
-
DateTime#to_time现在保留时区。[Bug #12189]
-
-
-
更新至
Psych2.2.2
-
-
RDoc
-
更新至 RDoc 5.0.0
-
-
RubyGems
-
更新至 RubyGems 2.6.8
-
-
shellwords
-
Shellwords.shellwords(shellsplit) 仅在反斜杠后跟以下字符之一时才将其视为转义字符:$ ‘ “ \ <newline> [Bug #10055]
-
-
-
Time#to_time现在保留时区。[Bug #12271]
-
-
thread
-
已移除扩展库。到 2.0 版本为止,它是一个纯 Ruby 脚本 “thread.rb”,它优先于 “thread.so”,并且自 2.1 版本以来一直包含在 $LOADED_FEATURES 中。
-
-
Tk
-
Tk 已从标准库中移除。[Feature #8539]
github.com/ruby/tk 是新的上游。
-
-
XMLRPC
-
XMLRPC 已从标准库中移除,并作为 gem 打包。[Feature #12160]
github.com/ruby/xmlrpc 是新的上游。
-
-
-
Zlib.gzip和Zlib.gunzip[Feature #13020]
-
C API 更新
-
如果 RUBY_SHOW_COPYRIGHT_TO_DIE 设置为 0,ruby_show_version() 将不再退出进程。这将在未来成为默认设置。
-
rb_gc_adjust_memory_usage() [Feature #12690]
支持的平台变更
-
不再支持 FreeBSD < 4
实现改进
-
在某些条件下,`[x, y].max` 和 `[x, y].min` 得到了优化,不会创建临时数组。具体的条件是实现细节:当前,数组字面量不能包含 splat,必须至少有一个表达式但必须是字面量,长度必须小于等于 0x100,并且
Array#max和 min 不能被重新定义。它将在大多数旨在实现 `Math.max(x, y)` 的偶然和实际用例中工作。 -
线程死锁检测现在显示它们的堆栈跟踪和依赖关系。[Feature #8214]
-
st_table(st.c)内部数据结构已得到改进。[Feature #12142]
-
Rational得到了广泛优化。[Feature #12484]
杂项更改
-
ChangeLog 已从仓库中移除。
它通过 ‘make dist` 从 Subversion 中的提交消息生成。另请注意,现在人们应该遵循 Git 风格的提交消息。模板写在 简短(50 个字符或更少)的更改摘要 中。[Feature #12283]