引入模式匹配

作者:网络    发布时间:2020-03-26 22:53    浏览:

[返回]

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

搜索