经过一年的发展
主
- 实验性
支持 模式匹配 (模式匹配 ) 迭代给定对象并在存在模式匹配时分配一个值。case [0, [1, 2, 3]] in [a, [b, *c]] pa #=> 0
PB #=> 1
pc #=> [2, 3] 结束情况 {a: 0, b: 1}
在{a:0,x:1}中
:不可用
在 {a: 0, b: var} 中
p var #=> 1
结束 - 交互式计算 irb(REPL、Read-Eval-Print-Loop)的 shell 现在具有多行编辑功能,使用 readline 兼容库实现
线 ,用 Ruby 编写。 集成了 rdoc 支持,允许您查看 irb 中指定类、模块和方法的参考信息。 提供通过 Binding#irb 显示的代码行的颜色突出显示以及基类对象的检查结果。 - 新增紧凑型垃圾收集器(Compaction GC),可以对某个区域的内存进行碎片整理,解决了部分多线程Ruby应用程序运行过程中出现的内存碎片导致性能下降和内存消耗增加的问题。 将对象打包到堆上
建议的 GC.compact方法减少内存页的使用数量并优化操作的堆
CoW(写时复制)。 -
实施 准备根据列表中的位置(“def foo(a,b,c)”)和关键字(“def foo(key: val)”)来分隔参数。 基于关键字和位置的自动参数转换已被弃用,并且在 Ruby 3.0 分支中将不再受支持。 特别是,不推荐使用最后一个参数作为关键字参数,将基于关键字的参数作为最后一个哈希参数传递,以及将最后一个参数拆分为位置参数和关键字参数。def foo(键: 42); 结尾; foo({key: 42}) #警告
def foo(**kw); 结尾; foo({key: 42}) #警告
def foo(键: 42); 结尾; foo(**{key: 42}) # 好的
def foo(**kw); 结尾; foo(**{key: 42}) # 好的def foo(h, **kw); 结尾; foo(key: 42) # 警告
def foo(h, 键: 42); 结尾; foo(键: 42) #警告
def foo(h, **kw); 结尾; foo({key: 42}) # 好的
def foo(h, 键: 42); 结尾; foo({key: 42}) # 好的def foo(h={}, 键: 42); 结尾; foo("key" => 43, key: 42) # 警告
def foo(h={}, 键: 42); 结尾; foo({"key" => 43, key: 42}) # 警告
def foo(h={}, 键: 42); 结尾; foo({"key" => 43}, key: 42) # 好的def foo(opt={}); 结尾; foo( key: 42 ) # 好
def foo(h, **nil); 结尾; foo(key: 1) #ArgumentError
def foo(h, **nil); 结尾; foo(**{key: 1}) # 参数错误
def foo(h, **nil); 结尾; foo("str" => 1) # 参数错误
def foo(h, **nil); 结尾; foo({key: 1}) # 好的
def foo(h, **nil); 结尾; foo({"str" => 1}) # 好的h = {}; def foo(*a) 结束; foo(**h) # [] h = {}; def foo(a) 结束; foo(**h) # {} 和警告
h = {}; def foo(*a) 结束; foo(h) # [{}] h = {}; def foo(a) 结束; foo(h) # {} -
机会 使用块参数的编号默认变量名称。[1, 2, 3].each { put @1 } # 与 [1, 2, 3].each { |i| 相同放我 }
- 对没有初始值的范围的实验支持。
ary[..3] # 与 ary[0..3] 相同 rel.where(销售额: ..100)
- 添加了 Enumerable#tally 方法,该方法计算每个元素出现的次数。
[“a”,“b”,“c”,“b”].tally
#=> {“a”=>1,“b”=>2,“c”=>1} - 允许使用文字“self”调用私有方法
定义 foo
结束
私人:foo
自我.foo - 添加了 Enumerator::Lazy#eager 方法以从惰性 (Enumerator::Lazy) 枚举生成正常枚举。
a = %w(foo bar baz)
e = a.lazy.map {|x| x.upcase }.map {|x| x+“!” }。渴望的
p e.class #=> 枚举器
p e.map {|x| x + “?” } #=> [“FOO!?”,“BAR!?”,“BAZ!?”] - 实验性 JIT 编译器的开发仍在继续,它可以显着提高 Ruby 语言应用程序的性能。 Ruby中提出的JIT编译器首先将C代码写入磁盘,然后调用外部C编译器生成机器指令(支持GCC、Clang和Microsoft VC++)。 新版本实现了必要时内联部署的方法,编译时选择性应用优化模式,“--jit-min-calls”的默认值从5增加到10000,以及“--jit-max-cache”从 1000 到 100 。
- 改进了 CGI.escapeHTML、Monitor 和 MonitorMixin 的性能。
- Module#name、true.to_s、false.to_s 和 nil.to_s 确保返回的字符串对于指定对象来说是未更改的。
- RubyVM::InstructionSequence#to_binary; 方法生成的二进制文件的大小已减小。
- 内置组件的更新版本,包括
捆绑器 2.1.2、RubyGems 3.1.2、
拉克 1.4.15,
CSV 3.1.2、REXML 3.2.3、
RSS 0.2.8,
字符串扫描仪 1.0.3; - 库已从基础包移至外部 gem 包
CMath(cmath gem),
Scanf(扫描宝石),
贝壳(贝壳宝石)
同步器(同步宝石),
ThreadsWait(思考宝石),
E2MM(e2mmap 宝石)。 - 默认的 stdlib 模块发布在 rubygems.org 上:
基准,
CG,
代表,
获取选择长,
网络流行音乐,
网络 smtp,
打开3,
存储库,
单例。 监控模块未移至 rubygems.org
观察者,
暂停,
示踪剂,
讨厌,
yaml,仅随 ruby-core 提供。 - 现在构建 Ruby 需要支持 C99 标准的 C 编译器。
来源: opennet.ru