您好,登錄后才能下訂單哦!
本篇內容主要講解“Ruby 2.3新特征有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Ruby 2.3新特征有哪些”吧!
讓我們查看引入了哪些新函數。
# Install using RVMrvm install 2.3.0# Using Rbenvbrew upgrade ruby-build --HEADrbenv install 2.3.0
引入了新的運算符(&.)。在您需要在調用對象上的方法之前檢查對象是否為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!
方法。
在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數據時可能非常有用 我們已經解析為哈希。
當您由于方法名稱中的錯字而收到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版本中最喜歡的函數。 使錯誤消息更有用具有巨大的影響 使該語言更易于使用, 特別是對于初學者。
散列現在已在其上定義了比較方法。如果看到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新特征有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。