2013-07-02 126 views
3

鑑於我有一個可能丟失鍵的opts散列,什麼被認爲是更好或更習慣Ruby?這:Ruby風格:默認值散列

my_val = opts.delete(:key){|k| default_value_for_key } 

或:

my_val = opts.delete(:key) || default_value_for_key 

因爲我想提取值時,從哈希刪除鍵。

+0

第二個樣本很好可讀。 –

+0

這是我一段時間內做這種事的默認方法,但是最近我遇到了一些代碼,它是第一種方式,所以它讓我想知道。 – rainkinz

+0

請注意,這兩段代碼並不總是做同樣的事情。考慮值爲'nil'的情況。 –

回答

2

關鍵字參數:

如果您在使用Ruby 2.0或更高版本,最習慣的方式來做事是使用keyword arguments

def foo(bar: 10) 
    # do something with bar 
end 

關鍵詞參數功能自動進行分配的護理默認值並在提供未知密鑰時拋出異常。

如果您沒有使用Ruby 2.0,或者由於某些其他原因導致關鍵字參數不起作用,您應該決定您的方法是否會檢測未知鍵並拋出錯誤,或者只是默默地忽略它們。

默默忽略未知鍵:

def foo(opts={}) 
    bar = opts.fetch(:bar, 10) 
    # do something with bar 
end 

使用fetch可以比使用opts[:bar] || 10,因爲它允許方法的調用者指定bar=nilbar=false更好。如果運算符爲零或爲假,則||運算符將導致您重寫從散列返回的任何值。

抱怨未知鍵:

如果你有很多的按鍵,並希望當一個未知的給出一個拋出異常,你應該使用delete。這裏的想法是,當你完成刪除已知密鑰時,只剩下未知的密鑰。

def foo(opts={}) 
    opts = opts.dup # Avoid deleting from the hash the caller passed 
        # in because that would surprise the caller! 

    bar = opts.delete(:bar) { 10 } 
    # get other options 

    raise "Unknown keys #{opts.keys.inspect}" if !opts.empty? 

    # do stuff 
end 
+0

最後一個例子正是我想要做的。謝謝 – rainkinz

3

我認爲你可以使用fetch的默認選項。

my_val = opts.fetch(:key, "default_value_for_key") 

編輯:

既然你要刪除的關鍵,以塊的形式是恕我直言去,因爲它會返回無論塊計算的方式。

但是,第二種選擇在眼睛上更容易。

+0

是的,我喜歡那樣。對不起,我沒有清楚,但刪除密鑰的哈希。更新我的問題。 – rainkinz