引入模式匹配

Ruby 2.7.0-rc2 揭橥了,最后版本布署于 12 月 25 日揭橥。

Ruby 2.7.0
稳定版在圣诞节当天发布了,此版本引进了多数新特征和总体性纠正,最值得注意的统揽:

此版本引进了繁多新特色和本性改革,最值得注意的饱含:

  • 形式匹配(Pattern Matching)
  • REPL 改进
  • 紧凑 GC(Compaction GC)
  • 职务参数和首要字参数的分离
  • 方式相配

情势相称(实验性意义)

情势匹配是函数式编制程序语言中清汤寡水应用的特征,假设相称某一个方式,它能够遍历给定的指标并分配其值,近期尚处在试验阶段 [Feature
#14912]:

require "json"

json = <<END
{
  "name": "Alice",
  "age": 30,
  "children": [{ "name": "Bob", "age": 2 }]
}
END

case JSON.parse(json, symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
  p age #=> 2
end

关于该作用的切切实实细节请查看 Pattern matching – New feature in Ruby
2.7。

情势相称是函数式编制程序语言中广泛运用的特点,如果合营某二个形式,它能够遍历给定的目的并分配其值:

REPL 改进

绑定的交互作用式遇到 irb 今后扶植多行编辑,由 reline 提供支撑,reline
是一种与 readline 包容的纯 Ruby 实现。它还提供了 rdoc 集成。在 irb
中,能够来得给定类、模块或形式的援引。别的,binding.irb
中显得的源代码行和宗旨类对象的检查结果先天以颜料区分突显。

图片 1

require "json"

json = <<END
{
  "name": "Alice",
  "age": 30,
  "children": [{ "name": "Bob", "age": 2 }]
}
END

case JSON.parse(json, symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
  p age #=> 2
end

紧凑 GC(Compaction GC)

紧密 GC 可以对碎片化的内存空间进行零散整理。一些八线程 Ruby
程序或者会促成内部存款和储蓄器碎片,从而导致高内部存储器使用率和速度下落。引进了
GC.compact
方法来压缩堆,此函数压缩堆中的活动对象,以便能够采纳更加少的页,何况堆可能对
CoW 更要好。

  • REPL 改进

任务参数和根本字参数的分离

一字千钧词参数和岗位参数的电动调换被标识为已放弃(deprecated),自动转变将会在
Ruby 3 中被移除。[功能
#14183]

  • 当方法传入八个 Hash
    作为最后四个参数,可能传播的参数未有主要词的时候,会抛出警报。假若须求继续将其视为入眼词参数,则要求步向七个星号来制止警示并保障在
    Ruby 3 中行为不荒谬化。

  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
  • 当方法传入四个 Hash
    到一个肩负入眼词参数的不二等秘书技中,可是未有传递丰盛的地点参数,关键词参数会被视为最后叁个岗位参数,并抛出一个警告。请将参数包装为
    Hash 对象来防止警示并有限支撑在 Ruby 3 中央银行事平常化。

  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
  • 当方法选用尊敬词参数字传送入,但不会进展重大词分割(splat),且传入同不经常间含有
    Symbol 和非 Symbol 的 key,那么 Hash
    会被细分,不过会抛出警示。你须要在调用时传出四个分其他 Hash 来确认保证在
    Ruby 3 中表现不奇怪化。

  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
  • 当多个形式不收受着重词,可是调用时传出了要害词,关键词会被视为地方参数,不会有警示抛出。这一行为将会在
    Ruby 3 中接二连三专门的学业。

  def foo(opt={});  end; foo( key: 42 )   # OK
  • 一经艺术扶植大肆参数字传送入,那么非 Symbol
    也会被允许作为重大词参数字传送入。[功能
    #14183]

  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
  • 将空的重要词分割(splat)传入多少个不收受入眼词的情势不会持续被看成空
    Hash
    管理,除非空哈希被看作贰个必不可缺参数,并且这种场所会抛出警告。请移除双星号来将
    Hash 作为职务参数字传送入。[功能
    #14183]

  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)    # {}

一旦要禁止使用“弃用提示告诫(deprecation
warnings)”,请使用命令行参数-W:no-deprecated或添加Warning[:deprecated] = false到代码中。

绑定的交互作用式情况 irb 未来扶助多行编辑,由 reline 提供支撑,reline
是一种与 readline 包容的纯 Ruby 完结。它还提供了 rdoc 集成。在 irb
中,可以来得给定类、模块或情势的引用。其他,binding.irb
中显示的源代码行和主题类对象的检查结果今日以颜料区分突显。

别的值得关心的新特点

  • 主意援引运算符,.:,作为实验性意义步向了。功能
    #12125、功能
    #13581

  • 实验性地参预了把号码参数作为暗许的块参数的风味。功能
    #4475

  • 无头范围实验性地投入了。它或然即便没有最佳范围那么有用,但它对开发DSL 是拾壹分实惠的。功能
    #14799

  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!?"]

图片 2

特性校正

  • JIT [试验性质]

    • 当优化若是不成事时,JIT
      后的代码只怕会被重复编写翻译到优化程度异常低的代码。

    • 当方法(Method)被感到是纯函数(pure)时,博览会开药方式内联优化。这种优化措施仍然为实验性的,大多办法不被感觉是纯函数。

    • --jit-min-calls 的暗中认可值从 5 调度到 10,000。

    • --jit-max-cache 的暗许值从 1,000 调度到 100。

  • Symbol#to_s,Module#name,true.to_s,false.to_snil.to_s`
    今后一味重临叁个结霜(frozen)字符串。重临的字符串始终和加以的对象相等。
    [实验性] [功能
    #16150]

  • CGI.escapeHTML 的性质被进级了。GH-2226

网站地图xml地图