Ruby 2.7.0 穩定版在聖誕節當天發布了,此版本引入了許多新特性和性能改進,最值得注意的包括:
模式匹配是函數式編程語言中廣泛使用的特性,如果匹配某一個模式,它可以遍歷給定的對象並分配其值,目前尚處於實驗階段 [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。
綁定的互動式環境 irb 現在支持多行編輯,由 reline 提供支持,reline 是一種與 readline 兼容的純 Ruby 實現。它還提供了 rdoc 集成。在 irb 中,可以顯示給定類、模塊或方法的引用。此外,binding.irb 中顯示的源代碼行和核心類對象的檢查結果現在以顏色區分顯示。
緊湊 GC 可以對碎片化的內存空間進行碎片整理。一些多線程 Ruby 程序可能會導致內存碎片,從而導致高內存使用率和速度下降。引入了 GC.compact 方法來壓縮堆,此函數壓縮堆中的活動對象,以便可以使用更少的頁,並且堆可能對 CoW 更友好。
關鍵詞參數和位置參數的自動轉換被標記為已廢棄(deprecated),自動轉換將會在 Ruby 3 中被移除。[功能 #14183]
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) # {}
如果要禁用「棄用提醒警告(deprecation warnings)」,請使用命令行參數-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 后的代碼可能會被重新編譯到優化程度較低的代碼。
當方法(Method)被認為是純函數(pure)時,會進行方法內聯優化。這種優化方法仍是實驗性的,許多方法不被認為是純函數。
--jit-min-calls
的默認值從 5 調整到 10,000。
--jit-max-cache
的默認值從 1,000 調整到 100。
Symbol#to_s,
Module#name,
true.to_s,
false.to_s 和
nil.to_s` 現在始終返回一個凍結(frozen)字元串。返回的字元串始終和給定的對象相等。 [實驗性] [功能 #16150]
CGI.escapeHTML
的性能被提升了。GH-2226
現在進行塊方法調用時,如果 Proc.new
和 proc
在沒有 block 會產生警告。
lambda
在方法調用時如果沒有 block 會產生區塊錯誤。
Unicode 和 Emoji 版本從 11.0.0 更新至 12.0.0。[功能 #15321]
更新 Unicode 至 12.1.0 版本,新增對於新年號「令和」 U+32FF 的支持。[功能 #15195]
Date.jisx0301
、Date#jisx0301
和 Date.parse
展示支持新的日本年號作為非正式的擴展功能,直到新的 JIS X 0301 發布。[功能 #15742]
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.bz2
SIZE: 14703381
SHA1: b54f4633174dbc55db77d9fd6d0ef90cc35503af
SHA256: 7aa247a19622a803bdd29fdb28108de9798abe841254fe8ea82c31d125c6ab26
SHA512: 8b8dd0ceba65bdde53b7c59e6a84bc6bf634c676bfeb2ff0b3604c362c663b465397f31ff6c936441b3daabb78fb7a619be5569480c95f113dd0453488761ce7
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.gz
SIZE: 16799684
SHA1: 6f4e99b5556010cb27e236873cb8c09eb8317cd5
SHA256: 8c99aa93b5e2f1bc8437d1bbbefd27b13e7694025331f77245d0c068ef1f8cbe
SHA512: 973fc29b7c19e96c5299817d00fbdd6176319468abfca61c12b5e177b0fb0d31174a5a5525985122a7a356091a709f41b332454094940362322d1f42b77c9927
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.xz
SIZE: 11990900
SHA1: 943c767cec037529b8e2d3cc14fc880cad5bad8d
SHA256: 27d350a52a02b53034ca0794efe518667d558f152656c2baaf08f3d0c8b02343
SHA512: dd5690c631bf3a2b76cdc06902bcd76a89713a045e136debab9b8a81ff8c433bbb254aa09e4014ca1cf85a69ff4bcb13de11da5e40c224e7268be43ef2194af7
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.zip
SIZE: 20571744
SHA1: fbebdd3a2a641f9a81f7d8db5abd926acea27e80
SHA256: 8bf2050fa1fc76882f878fd526e4184dc54bd402e385efa80ef5fd3b810522e0
SHA512: 5060f2dd3bfd271ef255b17589d6d014260d7ec2d97b48112b717ee01c62fe125c3fe04f813e02d607cea3f0a2a812b14eb3a28d06c2551354dfeff5f4c3dd6b
享受使用 Ruby 2.7 編程吧!
[admin
]