2011-07-03 10 views
4

私はRubyとRailsを使っているので、RubyのRails拡張はうまくいくはずです。Rubyのインスタンス変数に自動的に型/クラスを組み込む組み込みの方法はありますか?

実際にインスタンス変数を定義するよりも簡単なインスタンス変数(setterとgetterではなく)に型を効果的に強制する方法があるのだろうかと思います。

クラスメソッドattr_accessorなどは、型を強制しません。例えば、RailsのActiveRecord::Baseクラスがセッターで自動キャスティングを行うことに気付いた。特定のアクティブなレコード変数が整数であることをデータベースから認識し、それを@record.integer_variable = '1'で設定すると自動的に引数がキャストされ、@record.integer_variable # => 1を介してさらにアクセスすることができます。

これを利用する方法はありますか?

私は自分のゲッターとセッターをクラスメソッドとして書くことができましたが、スマートフォークが既に重労働をしていれば、自分自身を信頼する必要はありません。

答えて

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 

2番目に放出されたメソッドを変更したり、コンバージョンをいくつか実行したりすることで、少し賢明にすることができます。

ここに参考になります:http://www.raulparolari.com/Ruby2/attr_accessor

多くのコードを手動でコピーアンドペーストすることでできることはほとんど、メタプログラミングで解決できることを覚えておいてください。

関連する問題