Ruby 2.6 的一些变化

首先,我对本文内容的真实性和真确性完全不负责,谨请注意,如果认为本文抄袭了您的相关文章,请联系我,我会第一时间删除。

没有什么用的说明

Ruby在国内的发展已经基本上可以用大爆死来形容了,但是这并不影响其自身的发展,虽然3.0版本遥遥无期,但是局部的更新还是没有断过(目前已正式发布了2.6),最近不注意网上看到有更新了些内容,考虑到后面也要慢慢更新这个git,因此多多少少写点,希望自己能坚持下来。。。。。

Bundle 的升级

首先,Ruby开发绝对少不了的Bundle工具,终于迎来了大版本的跨越,从v1.17版本,走向了v2.0版本。同时,随着版本的升级,对与基本的要求也进行了一个提高:

#变更点
ruby > 2.3
rubygems > 3.0.0
使用 github: "some/repo" 时,将默认启用https
错误和警告信息将默认输出到 STDERR
Bundle 将会根据 lockfile 版本进行自动切换

emmmmm, 对于国内最大的影响应该是 2.3这个条件吧,毕竟国内目前大部分的项目都是基于2.2.3或以下的版本进行开发的,但是从实际来说可能还好,问题是其它gem包的同步更新。

JIT(Just-in-time)

官方文档可知,ruby2.6中引入了JIT,最终目的是为了提高ruby的执行速度。一说起执行速度,我想起了即将合拍的西游记即将正式开机。。。。,基本上已成为了ruby一辈子的痛点,几乎任何相关ruby方面的讨论和技术选择,最终都会说到这一块上来。这次通过编译后再执行,效率方面官方表示对比ruby2.5版本,将拥有1.7倍的提升,下面截取官方的部分说明:

JIT 编译器旨在提任何 Ruby 程序的执行速度。不同于其他语言中常见的 JIT 编译器,Ruby 的 JIT 编译器进行 JIT 编译的过程非常独特。其将生成的 C 代码打印至磁盘并 spawn 常见的 C 编译器进行代码的生成工作。

目前 JIT 编译器只当 Ruby 由 gcc clang 或 Microsoft VC++ 编译后,编译器仍可被运行时发现时可用,除此之外你暂时无法使用 JIT。

部分新特性

  • Kernel#yield_self 添加了新别名 then yield_selfblock自身的一个方法,2.5版本新增,提供了一种可以实现类似管道pipeline的方法(此说法不完全正确),直接使用yield_self方法,讲道理,感觉挺别捏的,但是增加then后,至少个人感觉会好很多。
#yield_self
"My name is".yield_self{|str1| str1 + " Millim"}  #My name is Millim
                .yield_self{|str2| str2 + " 才怪!"}   #My name is Millim 才怪!           
#then
"My age is".yield_self{|str1| str1 + " 31!"} #My age is 31!
               .then{|str2| str2.gsub("31","18")} # My age is 18!                
  • 增加实验性质的RubyVM::AbstractSyntaxTree模块 提供parse方法(传入字符串)和parse_file(传入文件)方法,将会返回一个AST(抽象语法树),返回的内容将封装进RubyVM::AbstractSyntaxTree::Node类中。

  • 引入了无限范围,例如以前必须采用1..10的形式,现在可以直接1..(后面不用参数)来表示,当然带来的风险都懂的。
  • 新增 oneshot 模式 ,代码检查相关,这个模式检查每一行代码是否都至少被执行一次,需要的人自然了解
  • FileUtils增加cp_lr,什么作用可以直接根据名字来看。

部分新特性

  • Kernel#yield_self 添加了新别名 then yield_selfblock自身的一个方法,2.5版本新增,提供了一种可以实现类似管道pipeline的方法(此说法不完全正确),直接使用yield_self方法,讲道理,感觉挺别捏的,但是增加then后,至少个人感觉会好很多。
#yield_self
"My name is".yield_self{|str1| str1 + " Millim"}  #My name is Millim
                .yield_self{|str2| str2 + " 才怪!"}   #My name is Millim 才怪!           
#then
"My age is".yield_self{|str1| str1 + " 31!"} #My age is 31!
               .then{|str2| str2.gsub("31","18")} # My age is 18!                
  • 增加实验性质的RubyVM::AbstractSyntaxTree模块 提供parse方法(传入字符串)和parse_file(传入文件)方法,将会返回一个AST(抽象语法树),返回的内容将封装进RubyVM::AbstractSyntaxTree::Node类中。

  • 引入了无限范围,例如以前必须采用1..10的形式,现在可以直接1..(后面不用参数)来表示,当然带来的风险都懂的。
  • 新增 oneshot 模式 ,代码检查相关,这个模式检查每一行代码是否都至少被执行一次,需要的人自然了解
  • FileUtils增加cp_lr,什么作用可以直接根据名字来看。

新增的部分module

  • Shellwords module, UNIX命令相关,主要解决ruby执行系统命令时会到的一个坑爹问题。
  • English module,引用后会为一部分全局变量添加英文版别名:比如 $$,知道这是什么吗?引用此module后,会提供一个别名$PID
  • Prime module, 质数相关。
  • Abbrev module,获取指定字符串数组的缩写。。看看官方例子就行:
require 'abbrev'
require 'pp'

pp Abbrev.abbrev(['ruby'])
#=>  {"ruby"=>"ruby", "rub"=>"ruby", "ru"=>"ruby", "r"=>"ruby"}

pp Abbrev.abbrev(%w{ ruby rules })

#返回
{ "ruby"  =>  "ruby",
  "rub"   =>  "ruby",
  "rules" =>  "rules",
  "rule"  =>  "rules",
  "rul"   =>  "rules" }
  • 最后是Net module,增加了POP3类型,嗯,脚本发邮件更方便装逼了

以上,实际应用的东西其实不太多,还是老老实实等3.0吧。

评论