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