Ruby 2.7的新功能,方法和改进

Baklib
Baklib 最后一次编辑 大约 4 年前
281
Ruby永远不会停止改进!
2.7版具有新功能,方法和性能改进。它于2019年12月25日发布。
现在,据Matz称...
这是最新的2.x版本。因为明年我们将获得Ruby 3.0!
但是在我们到达那里之前...
让我们看一下2.7中的一些更改和新功能,以便您可以准备进行版本更新。
内容[ 隐藏 ]
  1. 1个可计数的
  2. 2个编号的块参数[实验性]
  3. 3数组#交集
  4. 4 Enumerable#filter_map
  5. 5枚举器
  6. 6 IRB可以整容吗?
  7. 7 Ruby模式匹配[实验性]
  8. 8其他变化
  9. 9小结9.1相关
  10. 9.1相关

可枚举

这是一个新的Ruby方法,它对数组中的所有元素进行计数并返回带有其计数的哈希值。
您可以自己执行此操作,但是这种tally方法可以节省您的工作。
这是一个例子:
获取我的终极Ruby秘籍表: 这个方便的7页PDF帮助您快速找到所需的Ruby语法,正在寻找的Ruby方法或您不太记得其名称的内置类。
  1. %w (aaabbc )。相符
结果是:
  1. { “ a” => 3 ,“ b” => 2 ,“ c” => 1 }
我喜欢!

块的编号参数[实验]

我一直想要的一个有趣的新功能是块参数的默认名称。
这是一个常规块,带有一个参数:
  1. [ 1 ,2 ,3 ] 。每个{ | n | 看跌期权ñ }
|n|是必须定义才能使用的参数。
但是,如果我们有一个默认名称怎么办?
嗯,这是Ruby 2.7带来的优点之一,尽管作为一项实验性功能,它可以为我们节省很多打字工作。
看起来是这样的:
  1. [ 1 ,2 ,3 ] 。每个{ 放置_1 }
如果_1引用第一个参数,则可以使用,_2如果您有第二个参数,可以使用,如果是,_3请使用第三个参数,依此类推。
太酷了!
现在,进行一些琐事。
最初建议将此功能看起来像@1,但是看起来太像实例变量,因此在进行了一些讨论之后,便决定_1改用。

数组#交集

这是一种新方法,但不是新功能。
其实…
这更像是别名
红宝石2.6引入阵列uniondifference方法,以匹配的更简洁的等同物Array#|,和Array#-
但是缺少的操作是intersection,它还有另一个很难记住的简短版本。
Array#& method
现在:
这些方法有什么作用?它们如何工作?
范例:
  1. [ 1 ,2 ,3 ] 。交叉点([ 2 ,3 ,4 ] )
  2. #[2,3]
  3. [ 1 ,2 ,3 ] &[ 2 ,3 ,4 ]
  4. #[2,3]
好…
名称种类给它,intersection找到两个数组之间的交集。换句话说,它发现哪些元素是共有的。
简洁版本长版和路口|联盟–区别
我总是忘记这3种方法中的哪一种能起作用!
但是,使用这些新方法,由于它们的名称具有某种含义,因此记住起来要容易得多。
顺便说一句,这是编写好的代码的一个很好的教训。

可枚举#filter_map

filter_map方法是将selectmap方法组合为一个方法的尝试。
为什么?
因为先过滤列表,然后映射其余元素是一种常见的操作。
您可以通过两种方式执行此操作:
  1. (1 .. 8 )。选择(&:even ?)。地图{ | n | n ** 2 }
  2. # 要么
  3. (1 .. 8 )。地图{ | n | n ** 2,如果n。甚至?} 。紧凑
我都用过,但是我倾向于第一种,因为意图更明确。
现在:
在Ruby 2.7中,此filter_map方法可以一次性完成。
像这样:
  1. (1 .. 8 )。filter_map { | n | n ** 2,如果n。甚至?}
  2. #[4、16、36、64]
我不是在块中包含if语句的最大支持者,但是有时需要它们才能完成工作。
除此之外,您还应该了解一些内容。
filter_map操作的行为不像map + compact,因为它会删除false对象,而compact不会。
要记住的一件好事!

枚举器

这是您可能会发现有趣的另一种新方法,但可能需要一些创造力才能充分利用它。
这是Enumerator#produce方法。
它有什么作用?
根据功能建议:
“此方法产生无限序列,其中每个下一个元素是通过将块应用于前一个元素来计算的。”
是的
创建永无止境的序列的另一种方法!
这是一个例子:
  1. 枚举器。产生(1 ,&:next )。接(5 )
  2. #[1、2、3、4、5]
在此示例中,无论您执行take(10)还是都没有关系take(10_000),您将从中获得无限数量的值。
Btw 1是初始值。
并且&:next是对该值调用produce序列中下一个元素的方法。

IRB可以整容吗?

最近,IRB得到了一些关注和关注,而Ruby 2.7一直在增加它。
我们得到:
  1. 多行编辑
  2. 语法高亮
  3. 内置RDoc集成
  4. 默认情况下启用命令历史记录
  5. 默认情况下启用自动完成
实际上:
这是一个很大的更改,使用Ruby 2.7启动irb时会收到警告。
如果您希望继续使用旧版本的irb,则仍然可以使用该irb --legacy命令。这个新IRB的主要问题是行编辑,在旧版IRB(或在Pry中)中,我可以按住ALT键并按向左箭头以加快移动速度,但这在新IRB中不起作用。
试试看,看看它如何为您工作。

Ruby模式匹配[实验性]

2.7中经常需要的功能是模式匹配。
标记为实验性的。
但是什么是模式匹配?它对您有什么好处?
好吧,如果我正确理解这一点,那么模式匹配就像正则表达式一样,但是适用于数据结构(数组/哈希)。
这是一个例子:
  1. [ 1 ,2 ,3 ] 在[ A,B,C ] #真
  2. [ 1 ,2 ,3 ] 在[ 一个] #假
如果匹配,这些变量名(如a)将成为您可以访问的局部变量。
带有哈希值的示例:
  1. { 一个:1 ,B:2 ,C:[ ] } 在{ 一个:A,B:B,C:[ ] }
  2. #正确
  3. p 一
  4. #1
这使用in关键字。
这不是什么新事物,但并不常见,因为在Ruby 2.7之前in仅用作for 循环的一部分(在Ruby中不建议使用),因此我们可以重用此关键字以获取有用的信息。
更好的 ……
不管使用什么变量,a,b,c在这里都可以,但是f,g,h也可以。
一切都与模式有关!

其他变化

值得一提的一些其他更改。
  1. 新的压缩GC改善了内存碎片
  2. 方法参数**nil现在声明一个方法不包含关键字
  3. 方法实参...添加了实参转发机制(需要括号,如make_salad(...))
  4. 纤维改进。新的纤维对象池(从中分配了新的纤维)使纤维效率更高
  5. 线程改进。一种更好,更优化的线程创建方式使多线程更快
您如何看待这些?
2.7版的NEWS文件提到在光纤和线程创建方面的性能都提高了10倍,但我自己还没有对此进行测试,但是如果您让我知道您的结果。