稳定版发布

 联系我们     |      2020-01-25 18:35

https://www.ruby-lang.org/en/news/2019/12/21/2-7-0-rc2-released

别的自 2.6 版本的话明显的浮动

  • 生机勃勃部分标准库已被更新
    • Bundler 2.1.0.pre.1
    • RubyGems 3.1.0.pre.1
    • CSV 3.1.2 (NEWS)
    • Racc 1.4.15
    • REXML 3.2.3 (NEWS)
    • RSS 0.2.8 (NEWS)
    • StringScanner 1.0.3
    • 部分别的没有原本版本的库也被更新了。
  • 以往开展块方法调用时,假若 Proc.new 和 proc 在未有 block 会发生警示。

  • lambda 在艺术调用时大器晚成旦未有 block 会产生区块错误。

  • Unicode 和 Emoji 版本从 11.0.0 更新至 12.0.0。[功能 #15321]

  • 立异 Unicode 至 12.1.0 版本,新扩张对于新春号「令和」 U+32FF 的支撑。[功能 #15195]

  • Date.jisx0301Date#jisx0301 和 Date.parse 体现扶助新的东瀛年号作为非正式的恢弘功用,直到新的 JIS X 0301 公布。[功能 #15742]

  • 编译器必要扶持 C99 [杂项 #15347] *关于方言使用的具体新闻请查阅:

见 NEWS 或 付出日志 以查看实际情况。

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

属性修正

  • 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

  • 方式相称

职务参数和主要性字参数的分手

注重词参数和职责参数的机关转变被标志为已抛弃(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到代码中。

  • 压缩 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。

情势相称是函数式编制程序语言中广泛运用的特征,如若合营某一个方式,它能够遍历给定的对象并分配其值:

紧凑 GC(Compaction GC)

紧凑 GC 能够对碎片化的内部存款和储蓄器空间举办零散整理。一些十二线程 Ruby 程序可能会变成内部存款和储蓄器碎片,进而引致高内部存款和储蓄器使用率和速度下降。引进了 GC.compact 方法来压缩堆,此函数压缩堆中的活动指标,以便可以动用越来越少的页,而且堆大概对 CoW 更温馨。

减掉 GC 能够对碎片化的内部存款和储蓄器空间举办零散整理。一些五十三十二线程 Ruby 程序恐怕会促成内部存款和储蓄器碎片,进而招致高内部存款和储蓄器使用率和进程下跌。引进了 GC.compact 方法来收缩堆,此函数压缩堆中的活动指标,以便能够利用更加少的页,而且堆恐怕对 CoW 更要好。

Ruby 2.7.0 稳定版在圣诞节当天发表了,此版本引进了成百上千新特点和总体性改正,最值得注意的包罗:

实际情况查看更新表达:

REPL 改进

绑定的交互作用式遇到 irb 现在辅助多行编辑,由 reline 提供支持,reline 是大器晚成种与 readline 宽容的纯 Ruby 落成。它还提供了 rdoc 集成。在 irb 中,能够突显给定类、模块或措施的援引。别的,binding.irb 中展现的源代码行和宗旨类对象的反省结果明日以颜色区分呈现。

图片 1

不提出使用首要字参数和职位参数的自行转变,并且在 Ruby 3 中校删除此转变。

其他值得关注的新特点

  • 办法援用运算符,.:,作为实验性意义踏入了。功能 #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!?"]