2011-07-03 52 views
4

我正在使用Ruby和Rails,所以Ruby的任何Rails擴展都應該沒問題。是否有任何內置的方式來自動強制在Ruby中的實例變量的類型/類?

我不知道是否有一種方法來有效地迫使實例變量類型(更確切地說,他們的getter和setter方法),這比手動定義它們更容易。

類方法attr_accessor等不執行一個類型。我注意到例如Rails的ActiveRecord::Base類在setter上自動投射。它從一個特定的活動記錄變量是整數數據庫知道,用設置@record.integer_variable = '1'它自動轉換的參數,並允許通過@record.integer_variable # => 1進一步訪問。

有沒有辦法進入這個?

我可以寫我自己的getter和setter方法作爲類的方法,但如果聰明人已經完成繁重,我寧願沒有信任自己。

回答

2

我不知道是否已經存在一些事情,但你可以只用幾行元編程的解決了這個問題:

module EnforceTypes 
    def attr_accessor_of_type(name, type) 
    send :define_method, name do 
     instance_variable_get("@#{name}") 
    end 
    send :define_method, "#{name}=" do |v| 
     raise ArgumentException unless v.is_a? type 
     instance_variable_set("@#{name}", v) 
    end 
    end 
end 

用法:

class MyClass 
    extend EnforceTypes 

    attr_accessor_of_type :some_string, String 
end 

當然你可以通過改變第二種發射方法,執行一些轉換等來使它變得有點智能。

這裏有一個很好的參考:http://www.raulparolari.com/Ruby2/attr_accessor

記住,幾乎所有的東西,你可以通過手動複製和粘貼大量的代碼做,可以用元編程來解決。

相關問題