2011-08-01 132 views
2

除非明確指定,否則用默認值初始化記錄的常用做法是什麼?使用默認值初始化記錄

爲了說明我的問題藉此Python代碼:

class Encoder: 
    def __init__ (self, minLength = 1, maxLength = 258, maxDistance = 32768): 
     self.__minLength = minLength 
     self.__maxLength = maxLength 
     self.__maxDistance = maxDistance 
     self.__window = [] 
     self.__buffer = [] 

現在我試圖做同樣的事情在二郎,即創建一個可覆蓋默認的記錄。我的解決方案到目前爲止如下:

-record (encoder, {minLength, maxLength, maxDistance, window = [], buffer = [] }). 

init (Options) -> 
    case lists:keyfind (minLength, 1, Options) of 
     false -> MinLength = 3; 
     {minLength, MinLength} -> pass 
    end, 
    case lists:keyfind (maxLength, 1, Options) of 
     false -> MaxLength = 258; 
     {maxLength, MaxLength} -> pass 
    end, 
    case lists:keyfind (maxDistance, 1, Options) of 
     false -> MaxDistance = 32768; 
     {maxDistance, MaxDistance} -> pass 
    end, 
    #encoder {minLength = MinLength, 
     maxLength = MaxLength, 
     maxDistance = MaxDistance}. 

這是,很好,笨拙。

我的問題是:

  • 有一些語言結構或語法糖,節省了我所有的代碼?
  • 達到此目的的常見做法是什麼?
  • 什麼是常用的做法,而不是我的原子pass,我明顯偷了蟒蛇?
+1

你的意思是問:「我該如何構建一個記錄使用默認值?」,或者「我該如何構建具有默認值的記錄因爲我有一個現有的名單/目錄嗎?「? –

+0

@大衛後者。 – Hyperboreus

+1

明白了。在一個不相關的說明中,作爲一種風格問題,常見的做法是在原子中使用下劃線 - 例如min_length而不是minLength。 –

回答

5

你可以使用proplists模塊,像這樣:

 
-record (encoder, {minLength, maxLength, maxDistance, window = [], buffer = [] }). 

init (Options) -> 
    #encoder {minLength = proplists:get_value(minLength, Options, 1), 
     maxLength = proplists:get_value(maxLength, Options, 256), 
     maxDistance = proplists:get_value(maxDistance, Options, 32768)}. 

+0

謝謝,這就是我一直在尋找的東西。 – Hyperboreus