2017-03-15 20 views
2

如何編寫initalizer()方法來形成實例變量(空或否),然後遍歷一組參數以設置實例變量?使用可選參數的Ruby對象初始化

這是我想到的是:

def initialize(*p) 
    @sid      = "123asdf654" 
    @token     = "abc123" 
    @bert      = "1192875119" 
    @me      = "4165551212" 
    @media_url    = "" 
    @message     = "" 

    args.each do |k,v| 
    instance_variable_set("@#{k}", v) unless v.nil? 
    end 
end 

我希望有組已知實例變量(如圖所示)的能力,然後通過ARGS迭代,要麼更新所選實例變量的值,或創建新的。

回答

4

如果你要做到這一點,你需要不能接受的參數數組,就像你指定(可變參數風格),但任何一個選項散列或新關鍵字ARGS風格的選項。

的經典方法:

def initialize(attributes = nil) 
    attributes and attributes.each do |k,v| 
    instance_variable_set("@#{k}", v) unless v.nil? 
    end 
end 

新的關鍵字參數的方法:

def initialize(**options) 
    attributes.each do |k,v| 
    instance_variable_set("@#{k}", v) unless v.nil? 
    end 
end 

您也可以繼承OpenStruct得到這樣的行爲是免費的。

請記住有可能是這兩種方法很好地融合了新的選擇方式:

def initialize(sid: '123', token: '...', ...) 
    @sid = sid 
    @token = token 
    # ... 
end 

您可以指定命名關鍵字參數的默認值。

+0

最後一個似乎是最合法的,因爲它有多直接,如果我有違約。 –

+0

@Rich_F如果您不關心任何類型的Ruby 1.9兼容性,那麼我建議這樣做。因爲這已經結束了,你應該很好。 – tadman

+0

更關心抽象應用程序,或者在實例化時拋棄對象的新屬性而不是使用attr_accessor的一般方法。一步創造比兩個更好。 –