🎉🎉🎉
发布公告
https://www.ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released/
这次试验性的发布了官方 docker 镜像
https://hub.docker.com/r/rubylang/ruby
用 docker 快速尝试新版 irb:
docker run -it --rm rubylang/ruby irb
翻译自 https://www.ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released/
我们很高兴宣布 Ruby 2.7 已发布。
此版本引入了大量新特性和性能提升,其中最值得注意的是:
在函数式编程中非常常用的模式匹配功能,作为实验性功能被加入了。功能 #14912 它可以遍历一个对象,并在其满足某一模式时进行赋值。
case JSON.parse('{...}', symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
p age
...
end
关于更多信息,请查阅 Pattern matching - New feature in Ruby 2.7。
irb
,集成的交互环境 (REPL; Read-Eval-Print-Loop),现已支持多行编辑,由 reline
(一个 readline
兼容的库)实现了纯 Ruby 的支持。它还提供 rdoc 集成。在 irb
中您可以为指定的类、模块或方法的显示引用。功能 #14683、功能 #14787、功能 #14918 此外,Binding.irb
中显示的代码和核心类的检查结果现在已经可以彩色呈现。
此版本引入了 Compaction GC,可以对内存空间碎片进行整理。
某些多线程 Ruby 程序会导致内存碎片化,进而导致内存占用率提高和速度降低。
我们引入了 GC.compact
方法来压缩堆。此函数能压缩堆中的存活对象,以更少地占用内存分页。并且堆可能会变得对写入时复制(CoW)更友好。
功能 #15626
关键词参数和位置参数的自动转换被标记为已废弃(deprecated),自动转换将会在 Ruby 3 中被移除。[功能 #14183]
请查看文章 "Separation of positional and keyword arguments in Ruby 3.0" 来了解详情,下面仅叙述变更之处。
def foo(key: 42); end; foo({key: 42}) # warned
def foo(**kw); end; foo({key: 42}) # warned
def foo(key: 42); end; foo(**{key: 42}) # OK
def foo(**kw); end; foo(**{key: 42}) # OK
def foo(h, **kw); end; foo(key: 42) # warned
def foo(h, key: 42); end; foo(key: 42) # warned
def foo(h, **kw); end; foo({key: 42}) # OK
def foo(h, key: 42); end; foo({key: 42}) # OK
def foo(h={}, key: 42); end; foo("key" => 43, key: 42) # warned
def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned
def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
def foo(opt={}); end; foo( key: 42 ) # OK
def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
**nil
被允许使用在方法定义中,用来标记方法不接受关键词参数。以关键词参数调用这些方法会抛出 ArgumentError [功能 #14183]
def foo(h, **nil); end; foo(key: 1) # ArgumentError
def foo(h, **nil); end; foo(**{key: 1}) # ArgumentError
def foo(h, **nil); end; foo("str" => 1) # ArgumentError
def foo(h, **nil); end; foo({key: 1}) # OK
def foo(h, **nil); end; foo({"str" => 1}) # OK
h = {}; def foo(*a) a end; foo(**h) # []
h = {}; def foo(a) a end; foo(**h) # {} and warning
h = {}; def foo(*a) a end; foo(h) # [{}]
h = {}; def foo(a) a end; foo(h) # {}
如果你希望禁用废弃警告,请使用命令行参数 -W:no-deprecated
,或把 Warning[:deprecated] = false
加入你的代码。
ary[..3] # identical to ary[0..3]
rel.where(sales: ..100)
Enumerable#tally
,它会计算每个元素出现的次数。["a", "b", "c", "b"].tally
#=> {"a"=>1, "b"=>2, "c"=>1}
self
上调用私有方法 [功能 #11297] [功能 #16123]
def foo
end
private :foo
self.foo
Enumerator::Lazy#eager
。它会产生一个非懒惰的迭代器。[功能 #15901]
a = %w(foo bar baz)
e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
p e.class #=> Enumerator
p e.map {|x| x + "?" } #=> ["FOO!?", "BAR!?", "BAZ!?"]
JIT [实验性质]
--jit-min-calls
的默认值从 5 调整到 10,000。--jit-max-cache
的默认值从 1,000 调整到 100。Fiber 的缓存策略发生了改变,从而提升了其创建速度。 GH-2224
Symbol#to_s
, Module#name
, true.to_s
, false.to_s
和 nil.to_s
现在始终返回一个冻结(frozen)字符串。返回的字符串始终和给定的对象相等。 [实验性] [功能 #16150]
CGI.escapeHTML
的性能被提升了。GH-2226
Monitor 和 MonitorMixin 的性能被提升了。[功能 #16255]
1.9 中引入的 Per-call-site 方法缓存的性能提升了。缓存的命中率从 89% 提升到了 94%。详见 GH-2583
RubyVM::InstructionSequence#to_binary 方法会编译出二进制,二进制的尺寸被进一步缩小了。[功能 #16163]
一些标准库已被更新
下面这些库不再是自带 gem,如需使用请安装他们。
profile.rb
从标准库中被移除。
将下面的标准库提升至默认 gems
在方法调用中使用没有代码块的 Proc.new
和 proc
现在会抛出警告。
在有代码块的方法调用中使用没有代码块的 lambda
会抛出异常。
Unicode 和 Emoji 版本从 11.0.0 更新至 12.0.0。[功能 #15321]
更新 Unicode 至 12.1.0 版本,新增对于新年号「令和」U+32FF 的支持。[功能 #15195]
Date.jisx0301
、Date#jisx0301
和 Date.parse
支持新的日本年号。[功能 #15742]
编译器需要支持 C99 [杂项 #15347] *关于我们使用方言的具体信息请查阅:https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/C99
圣诞快乐,节日快乐,享受使用 Ruby 2.7 编程吧!
Ruby 是最初由 Matz(Yukihiro Matsumoto)于 1993 年开发,现在作为开源软件开发的语言。它可以在多个平台上运行,并在世界各地使用。尤其适合于网站的开发。
Rails 还没有发正式的适配 2.7 版本,虽然不会有什么问题,但是会多一些 warning 看着烦,问题比较大的地方在 bundler 2.1.2,如果遇到问题可以试试重新生成一下 bundle 的桩文件 bundle binstubs bundler
已完成升级,等 Ruby 等 2.7.0-alpine 的 Docker Image 打包好就可合并了
https://github.com/ruby-china/homeland/pull/1137
其中 sidekiq-scheduler
对 Ruby 2.7 的支持可能有问题,升级 2.7 以后,需要额外单独依赖 thwait, e2mmap
这两个 Gem 了。
其他部分也是 Warning 比较多。
也给 Docker Official image 提了 PR:
https://github.com/docker-library/ruby/pull/301
也是发现了 Bundler 的 binstubs
问题
如果重新升级桩文件还有问题,用 bundle exec
来执行命令目前测试是不会出现问题的
我升级我自己维护的 gem 的时候发现一些别的问题, bundle exec
可以解决
作为一个业余学写脚本的学生,一开始因为 ruby 的.each 遍历和 do...end 的奇怪的语法而排斥它。后来在 c 语言、java 和 perl5 里面踩了一些坑,决定试试 ruby,从此少了一些整体上的烦恼。虽然我自己写的脚本性能不一定能优化得好,但是修改起来还是容易多了。
现在一般是循规蹈矩地写命令(按c#的编程习惯),实在不得已要用一些灵活的动态方法时,都在irb里面测试完再用。