[譯] Ruby 2.6 增加了 Integer 和 Float 方法的異常引數

Madao-3發表於2018-08-02

本部落格系列翻譯自 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. 我們可以使用 IntegerFloat 方法各自來轉換值為整形或者浮點型。當然,你也可以用 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 IntegerFloat 方法允許接受 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,為了向後相容。

原文地址

部落格地址

相關文章