溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Ruby 2.3新特征有哪些

發(fā)布時(shí)間:2021-10-13 11:26:46 來源:億速云 閱讀:154 作者:iii 欄目:編程語(yǔ)言

本篇內(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

Safe navigation operator

引入了新的運(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! 方法。

Frozen string literals

在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)解析為哈希。

“Did you mean?”

當(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é)者。

Hash “comparison”

散列現(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í)!

向AI問一下細(xì)節(jié)

免責(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)容。

AI