您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Ruby 2.3新特征有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Ruby 2.3新特征有哪些”吧!
讓我們查看引入了哪些新函數(shù)。
# Install using RVMrvm install 2.3.0# Using Rbenvbrew upgrade ruby-build --HEADrbenv install 2.3.0
引入了新的運(yùn)算符(&.)。在您需要在調(diào)用對(duì)象上的方法之前檢查對(duì)象是否為nil的情況下,它可能非常有用。如果對(duì)象等于nil,它將返回nil,否則將調(diào)用該對(duì)象的方法。
# Ruby <= 2.2.x if user && user.admin? # do something end # Ruby 2.3 if user&.admin? # do something end
有一些注意事項(xiàng)需要考慮。 如果用戶設(shè)置為false,則第一個(gè)版本的評(píng)估結(jié)果為false, 但是安全的導(dǎo)航操作員會(huì)拋出 NoMethodError
。 這類似于Rails的 #try!
方法。
在Ruby 2.2之前,字符串在Ruby中默認(rèn)是可變的。 我們可以做類似 str [2] ='z'
之類的事情。 如果我們想使字符串不可變, 我們需要在其上調(diào)用#freeze
(例如, str ='foobar'.freeze
)。
使用凍結(jié)的(不可變的)字符串可以提高性能 因?yàn)镽uby現(xiàn)在必須分配更少的對(duì)象。 因此,有計(jì)劃 在Ruby 3.0中默認(rèn)使字符串不可變。
為了使過渡更容易, Ruby 2.3允許您選擇默認(rèn)情況下凍結(jié)所有字符串文字。 您可以通過添加評(píng)論來啟用此函數(shù) frozen_string_literal:true
在文件的開頭。 啟用后,文件中的所有字符串文字將被凍結(jié) 即使不對(duì)它們調(diào)用#freeze
。 請(qǐng)注意,這僅在具有注釋的文件上啟用該函數(shù)。
# frozen_string_literal: true str = 'cat' str[0] = 'b' # frozen.rb:5:in `[]=': can't modify frozen String (RuntimeError) # from frozen.rb:5:in `<main>'
盡管目前看來這似乎不是重大變化, 這將為順利過渡到Ruby 3.0鋪平道路。
Array#dig
and Hash#dig
這是標(biāo)準(zhǔn)庫(kù)的另一個(gè)有用的補(bǔ)充。 現(xiàn)在,我們可以訪問數(shù)組和哈希中的嵌套元素 使用更簡(jiǎn)單的API。
我們現(xiàn)在可以使用數(shù)組來做到這一點(diǎn):
list = [ [2, 3], [5, 7, 9], [ [11, 13], [17, 19] ] ] list.dig(1, 2) #=> 9 list.dig(2, 1, 0) #=> 17 list.dig(0, 3) #=> nil list.dig(4, 0) #=> nil
Hashes:
dict = { a: { x: 23, y: 29 }, b: { x: 31, z: 37 } } dict.dig(:a, :x) #=> 23 dict.dig(:b, :z) #=> 37 dict.dig(:b, :y) #=> nil dict.dig(:c, :x) #=> nil
這在處理JSON數(shù)據(jù)時(shí)可能非常有用 我們已經(jīng)解析為哈希。
當(dāng)您由于方法名稱中的錯(cuò)字而收到NoMethodError時(shí), Ruby現(xiàn)在可以幫助建議與該名稱相似的其他方法名稱。
2.3.0-preview1 :001 > "foo bar".uppcase NoMethodError: undefined method `uppcase' for "foo bar":String Did you mean? upcase upcase!
這可能看起來像個(gè)小小的變化, 但這是我在2.3版本中最喜歡的函數(shù)。 使錯(cuò)誤消息更有用具有巨大的影響 使該語(yǔ)言更易于使用, 特別是對(duì)于初學(xué)者。
散列現(xiàn)在已在其上定義了比較方法。如果看到a >= b,則它正在檢查b中的所有鍵值對(duì)是否也存在于a中。
{ x: 1, y: 2 } >= { x: 1 } #=> true{ x: 1, y: 2 } >= { x: 2 } #=> false{ x: 1 } >= { x: 1, y: 2 } #=> false
在上面的第一個(gè)示例中, RHS中的鍵值對(duì) [:x,1]
是 在LHS中的代碼- [[:x,1],[:y,2]]
, 因此它返回true。
這也適用于所有其他比較運(yùn)算符。 在Ruby中提出此函數(shù)的Olivier Lacan, 寫了一個(gè)很好的解釋 Ruby 2.3中的哈希比較。
Hash#to_proc
Hash#to_proc
返回一個(gè)lambda,該lambda將鍵與值映射。 當(dāng)您用鑰匙呼叫l(wèi)ambda時(shí), 它從哈希返回相應(yīng)的值。
h = { foo: 1, bar: 2, baz: 3} p = h.to_proc p.call(:foo) #=> 1 p.call(:bar) #=> 2 p.call(:quux) #=> nil
它本身似乎沒有用。為什么不使用 []
訪問元素?但是,當(dāng)我們使用&運(yùn)算符創(chuàng)建proc并將其傳遞給 Enumerable
塊時(shí),它變得很有趣。
h = { foo: 1, bar: 2, baz: 3} # instead of this: [:foo, :bar].map { |key| h[key] } #=> [1, 2] # we can use this syntax: [:foo, :bar].map(&h) #=> [1, 2]
Hash#fetch_values
此方法的工作方式類似于 Hash#values_at
- 它獲取與我們傳入的鍵列表相對(duì)應(yīng)的值。 區(qū)別在于,當(dāng)鍵不存在時(shí),#values_at
返回nil, 而#fetch_values
會(huì)為未顯示的鍵引發(fā) KeyError
。
h = { foo: 1, bar: 2, baz: 3} h.fetch_values(:foo, :bar) #=> [1, 2] h.values_at(:foo, :quux) #=> [1, nil] h.fetch_values(:foo, :quux) #=> raise KeyError
Enumerable#grep_v
grep_v
方法等效于 命令行g(shù)rep實(shí)用程序中的-v
選項(xiàng)。 它返回不符合條件的項(xiàng)目列表。
list = %w(foo bar baz) list.grep_v(/ba/) #=> ['foo'] list.grep(/ba/) #=> ['bar', 'baz']
到此,相信大家對(duì)“Ruby 2.3新特征有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。