中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Ruby 2.3新特征有哪些

發布時間:2021-10-13 11:26:46 來源:億速云 閱讀:158 作者:iii 欄目:編程語言

本篇內容主要講解“Ruby 2.3新特征有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Ruby 2.3新特征有哪些”吧!

讓我們查看引入了哪些新函數。

# Install using RVMrvm install 2.3.0# Using Rbenvbrew upgrade ruby-build --HEADrbenv install 2.3.0

Safe navigation operator

引入了新的運算符(&.)。在您需要在調用對象上的方法之前檢查對象是否為nil的情況下,它可能非常有用。如果對象等于nil,它將返回nil,否則將調用該對象的方法。

# Ruby <= 2.2.x
if user && user.admin?
  # do something
end

# Ruby 2.3
if user&.admin?
  # do something
end

有一些注意事項需要考慮。 如果用戶設置為false,則第一個版本的評估結果為false, 但是安全的導航操作員會拋出 NoMethodError 。 這類似于Rails的 #try! 方法。

Frozen string literals

在Ruby 2.2之前,字符串在Ruby中默認是可變的。 我們可以做類似 str [2] ='z'之類的事情。 如果我們想使字符串不可變, 我們需要在其上調用#freeze (例如, str ='foobar'.freeze )。

使用凍結的(不可變的)字符串可以提高性能 因為Ruby現在必須分配更少的對象。 因此,有計劃 在Ruby 3.0中默認使字符串不可變。

為了使過渡更容易, Ruby 2.3允許您選擇默認情況下凍結所有字符串文字。 您可以通過添加評論來啟用此函數 frozen_string_literal:true 在文件的開頭。 啟用后,文件中的所有字符串文字將被凍結 即使不對它們調用#freeze 。 請注意,這僅在具有注釋的文件上啟用該函數。

# 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

這是標準庫的另一個有用的補充。 現在,我們可以訪問數組和哈希中的嵌套元素 使用更簡單的API。

我們現在可以使用數組來做到這一點:

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數據時可能非常有用 我們已經解析為哈希。

“Did you mean?”

當您由于方法名稱中的錯字而收到NoMethodError時, Ruby現在可以幫助建議與該名稱相似的其他方法名稱。

2.3.0-preview1 :001 > "foo bar".uppcase
NoMethodError: undefined method `uppcase' for "foo bar":String
Did you mean?  upcase
               upcase!

這可能看起來像個小小的變化, 但這是我在2.3版本中最喜歡的函數。 使錯誤消息更有用具有巨大的影響 使該語言更易于使用, 特別是對于初學者。

Hash “comparison”

散列現在已在其上定義了比較方法。如果看到a >= b,則它正在檢查b中的所有鍵值對是否也存在于a中。

{ x: 1, y: 2 } >= { x: 1 } #=> true{ x: 1, y: 2 } >= { x: 2 } #=> false{ x: 1 } >= { x: 1, y: 2 } #=> false

在上面的第一個示例中, RHS中的鍵值對 [:x,1] 是 在LHS中的代碼- [[:x,1],[:y,2]] , 因此它返回true。

這也適用于所有其他比較運算符。 在Ruby中提出此函數的Olivier Lacan, 寫了一個很好的解釋 Ruby 2.3中的哈希比較。

Hash#to_proc

Hash#to_proc 返回一個lambda,該lambda將鍵與值映射。 當您用鑰匙呼叫lambda時, 它從哈希返回相應的值。

h = { foo: 1, bar: 2, baz: 3}
p = h.to_proc

p.call(:foo)  #=> 1
p.call(:bar)  #=> 2
p.call(:quux) #=> nil

它本身似乎沒有用。為什么不使用 [] 訪問元素?但是,當我們使用&運算符創建proc并將其傳遞給 Enumerable塊時,它變得很有趣。

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 - 它獲取與我們傳入的鍵列表相對應的值。 區別在于,當鍵不存在時,#values_at 返回nil, 而#fetch_values 會為未顯示的鍵引發 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 方法等效于 命令行grep實用程序中的-v 選項。 它返回不符合條件的項目列表。

list = %w(foo bar baz)

list.grep_v(/ba/)
#=> ['foo']

list.grep(/ba/)
#=> ['bar', 'baz']

到此,相信大家對“Ruby 2.3新特征有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

禄劝| 和林格尔县| 孝义市| 海安县| 始兴县| 南部县| 白银市| 蛟河市| 定兴县| 喀喇沁旗| 奎屯市| 灵川县| 乐清市| 阿坝| 蒙阴县| 藁城市| 遂平县| 张家口市| 荆门市| 邻水| 越西县| 黎城县| 杭锦旗| 辉南县| 调兵山市| 洞头县| 汨罗市| 辰溪县| 噶尔县| 台湾省| 千阳县| 精河县| 凤山市| 元谋县| 南川市| 东阿县| 长宁区| 永和县| 香格里拉县| 贵港市| 深州市|