Ruby永远不会停止改进!
2.7版具有新功能,方法和性能改进。它于2019年12月25日发布。
现在,据Matz称...
这是最新的2.x版本。因为明年我们将获得Ruby 3.0!
但是在我们到达那里之前...
让我们看一下2.7中的一些更改和新功能,以便您可以准备进行版本更新。
内容[ 隐藏 ]
可枚举
这是一个新的Ruby方法,它对数组中的所有元素进行计数并返回带有其计数的哈希值。
您可以自己执行此操作,但是这种
tally
方法可以节省您的工作。这是一个例子:
获取我的终极Ruby秘籍表: 这个方便的7页PDF帮助您快速找到所需的Ruby语法,正在寻找的Ruby方法或您不太记得其名称的内置类。
- %w (aaabbc )。相符
结果是:
- { “ a” => 3 ,“ b” => 2 ,“ c” => 1 }
我喜欢!
块的编号参数[实验]
我一直想要的一个有趣的新功能是块参数的默认名称。
这是一个常规块,带有一个参数:
- [ 1 ,2 ,3 ] 。每个{ | n | 看跌期权ñ }
这
|n|
是必须定义才能使用的参数。但是,如果我们有一个默认名称怎么办?
嗯,这是Ruby 2.7带来的优点之一,尽管作为一项实验性功能,它可以为我们节省很多打字工作。
看起来是这样的:
- [ 1 ,2 ,3 ] 。每个{ 放置_1 }
如果
_1
引用第一个参数,则可以使用,_2
如果您有第二个参数,可以使用,如果是,_3
请使用第三个参数,依此类推。太酷了!
现在,进行一些琐事。
数组#交集
这是一种新方法,但不是新功能。
其实…
这更像是别名!
但是缺少的操作是
intersection
,它还有另一个很难记住的简短版本。的
Array#& method
。现在:
这些方法有什么作用?它们如何工作?
范例:
- [ 1 ,2 ,3 ] 。交叉点([ 2 ,3 ,4 ] )
- #[2,3]
- [ 1 ,2 ,3 ] &[ 2 ,3 ,4 ]
- #[2,3]
好…
名称种类给它,
intersection
找到两个数组之间的交集。换句话说,它发现哪些元素是共有的。简洁版本长版和路口|联盟–区别
我总是忘记这3种方法中的哪一种能起作用!
但是,使用这些新方法,由于它们的名称具有某种含义,因此记住起来要容易得多。
顺便说一句,这是编写好的代码的一个很好的教训。
可枚举#filter_map
此
filter_map
方法是将select
&map
方法组合为一个方法的尝试。为什么?
因为先过滤列表,然后映射其余元素是一种常见的操作。
您可以通过两种方式执行此操作:
- (1 .. 8 )。选择(&:even ?)。地图{ | n | n ** 2 }
- # 要么
- (1 .. 8 )。地图{ | n | n ** 2,如果n。甚至?} 。紧凑
我都用过,但是我倾向于第一种,因为意图更明确。
现在:
在Ruby 2.7中,此
filter_map
方法可以一次性完成。像这样:
- (1 .. 8 )。filter_map { | n | n ** 2,如果n。甚至?}
- #[4、16、36、64]
我不是在块中包含if语句的最大支持者,但是有时需要它们才能完成工作。
除此之外,您还应该了解一些内容。
该
filter_map
操作的行为不像map + compact
,因为它会删除false
对象,而compact
不会。要记住的一件好事!
枚举器
这是您可能会发现有趣的另一种新方法,但可能需要一些创造力才能充分利用它。
这是
Enumerator#produce
方法。它有什么作用?
根据功能建议:
“此方法产生无限序列,其中每个下一个元素是通过将块应用于前一个元素来计算的。”
是的
创建永无止境的序列的另一种方法!
这是一个例子:
- 枚举器。产生(1 ,&:next )。接(5 )
- #[1、2、3、4、5]
在此示例中,无论您执行
take(10)
还是都没有关系take(10_000)
,您将从中获得无限数量的值。Btw
1
是初始值。并且
&:next
是对该值调用produce
序列中下一个元素的方法。IRB可以整容吗?
最近,IRB得到了一些关注和关注,而Ruby 2.7一直在增加它。
我们得到:
- 多行编辑
- 语法高亮
- 内置RDoc集成
- 默认情况下启用命令历史记录
- 默认情况下启用自动完成
实际上:
这是一个很大的更改,使用Ruby 2.7启动irb时会收到警告。
如果您希望继续使用旧版本的irb,则仍然可以使用该
irb --legacy
命令。这个新IRB的主要问题是行编辑,在旧版IRB(或在Pry中)中,我可以按住ALT键并按向左箭头以加快移动速度,但这在新IRB中不起作用。试试看,看看它如何为您工作。
Ruby模式匹配[实验性]
2.7中经常需要的功能是模式匹配。
标记为实验性的。
但是什么是模式匹配?它对您有什么好处?
好吧,如果我正确理解这一点,那么模式匹配就像正则表达式一样,但是适用于数据结构(数组/哈希)。
这是一个例子:
- [ 1 ,2 ,3 ] 在[ A,B,C ] #真
- [ 1 ,2 ,3 ] 在[ 一个] #假
如果匹配,这些变量名(如
a
)将成为您可以访问的局部变量。带有哈希值的示例:
- { 一个:1 ,B:2 ,C:[ ] } 在{ 一个:A,B:B,C:[ ] }
- #正确
- p 一
- #1
这使用
in
关键字。更好的 ……
不管使用什么变量,
a,b,c
在这里都可以,但是f,g,h
也可以。一切都与模式有关!
其他变化
值得一提的一些其他更改。
- 新的压缩GC改善了内存碎片
- 方法参数**nil现在声明一个方法不包含关键字
- 方法实参...添加了实参转发机制(需要括号,如make_salad(...))
- 纤维改进。新的纤维对象池(从中分配了新的纤维)使纤维效率更高
- 线程改进。一种更好,更优化的线程创建方式使多线程更快
您如何看待这些?
2.7版的NEWS文件提到在光纤和线程创建方面的性能都提高了10倍,但我自己还没有对此进行测试,但是如果您让我知道您的结果。