本文翻译自 blog.blockscore.com/new-features-in-ruby-2-4
===
本文介绍了Ruby 2.4 一些新特性:
- 新增 Regexp#match? 方法
- 新增 Enumerable#sum 方法
- Dir 和 File 的新方法 empty?
- 新方法 Regexp#named_captures
- 新方法 Integer#digits
- Logger 接口改进
- OptionParse语法改进
- Array 也有了 #min 和 #max
- 精简数字类型(Bignum,Fixnum)
- :capacity 指定新建字符串的内存大小
- 修改 Symbol 的 #match 返回值
超级快的 Regexp#match?
方法
Ruby 2.4 给正则表达式添加了新的 #match?
方法,它比任何的 Regexp 方法都快(三倍以上)。
当你使用 Regexp#===
、Regexp#=~
或 Regexp#match
时,Ruby 会创建 $~
这个全局变量来存放返回的 MatchData :
我们的这个 Regexp#match?
返回 boolean,避免了生成一个 MatchData 对象或更新全局状态(or updating global state 应该是指避免了更新 $~
这个全局变量的意思吧):
跳过了 $~
这个全局变量,Ruby 也就可以避免给 MatchData 去分配内存了。
Enumerable 的新方法 #sum
可以在任意一个 Enumerable
对象上调用 #sum
:
这个方法有一个可选参数,默认为0,这是该求和方法的初始值,所以 [].sum
的结果为 0。
如果你在非integer的array上面调用这个方法,那么你就需要提供一个初始值了:
最后一行的 ShoppingList.new
就是提供给 sum
的初始值了。
Dir 和 File 模块的新方法 empty?
File.empty?
等同于 File.zero?
(后者在所有受支持的 Ruby 版本中都可用)。
目前empty?
方法还不能用在 Pathname
上。
把已命名的匹配部分抽离出来 Regexp#named_captures
Ruby 2.4 中你可以用 #named_captures
方法把正则表达式中已命名的部分抽出来,放进一个 Hash 中:
Ruby 2.4 还增加了 #values_at
方法,用他可以生成一个只包含你想要的部分的数组:
新方法 Integer#digits
注意数组的0是最右边(个位上)的数字。
即使是非十进制的数字,也只需要传递一个参数,如下是16进制:
改进 Logger
接口
Ruby 2.3:
Ruby 2.4 把配置部分放在了构造函数中:
改进 OptionParse
使得生成Hash的语法更加简洁
Ruby 2.3 中,如果你希望把传入的参数都放入一个 Hash 中,你需要这样:
Ruby 2.4 你可以使用参数 :into
来实现:
Array 也有了 #min
和 #max
并且比 Enumerable
快一点(好吧。。)
精简了 Integers
Ruby 2.4 中你不再需要管理众多的数字类型:
Fixnum
和 Bignum
现在全都指向 Integer
:capacity 指定 String 的内存大小
Symbol 的#match
与 String 表现不一致
Ruby 2.3 的 Symbol#match 返回匹配的位置(index),而 String#match 返回值是 MatchData 。现在统一返回 MatchData 。