本部落格系列翻譯自 Bigbinary 的 Ruby 2.6 系列, 已得到作者允許。Ruby 2.6.0-preview2 現已釋出。
We can use Integer and Float methods to convert values to integers and floats respectively. Ruby also has to_i and to_f methods for same purpose. Let’s see how it differs from the Integer method.
我們可以使用 Integer
和 Float
方法各自來轉換值為整形或者浮點型。當然,你也可以用 to_i 或者 to_f 來達到這一目的。我們來看看這寫方法的異同:
>> "1one".to_i
=> 1
>> Integer("1one")
ArgumentError: invalid value for Integer(): "1one"
from (irb):2:in `Integer'
from (irb):2
from /Users/prathamesh/.rbenv/versions/2.4.0/bin/irb:11:in `<main>'
>>
複製程式碼
to_i 方法會嘗試儘可能地做到轉換,然而Integer 方法會因為無法轉換輸入為整形而丟擲異常。Float 和 to_f 方法也是同理。
有些時候,我們可能會嚴格地要求結果為整形或者浮點,但是又不願意我們無法轉換的時候會丟擲異常。
在 Ruby 2.6之前我們會這樣來達到目標:
>> Integer("msg") rescue nil
複製程式碼
Ruby 2.6 Integer
和 Float
方法允許接受 exception 這一個引數內容,值為 true
或者 false
。 如果是 false 那麼它就只會返回nil 而且不丟擲異常。
>> Float("foo", exception: false)
=> nil
>> Integer("foo", exception: false)
=> nil
複製程式碼
這比早前版本的異常處理再返回nil 要快不少。
>> Benchmark.ips do |x|
?> x.report("rescue") {
?> Integer('foo') rescue nil
>> }
>> x.report("kwarg") {
?> Integer('foo', exception: false)
>> }
>> x.compare!
>> end
Warming up --------------------------------------
rescue 41.896k i/100ms
kwarg 81.459k i/100ms
Calculating -------------------------------------
rescue 488.006k (± 4.5%) i/s - 2.472M in 5.076848s
kwarg 1.024M (±11.8%) i/s - 5.050M in 5.024937s
Comparison:
kwarg: 1023555.3 i/s
rescue: 488006.0 i/s - 2.10x slower
複製程式碼
如我們所見,過去的處理異常法會比新特性返回慢一倍。但如果需要返回自己想要設定的值而不是nil,我們仍可以繼續用過去的實踐方式。
>> Integer('foo') rescue 42
=> 42
複製程式碼
預設的,這個exception 還會是true,為了向後相容。