は、一般化のビットとジョシュアチークの答えを生かすために、
module Initializable
def initialize(params = {})
params.each do |key, value|
setter = "#{key}="
send(setter, value) if respond_to?(setter.to_sym, false)
end
end
end
class Foo
include Initializable
attr_accessor :name, :age, :email, :gender, :height
end
Foo.new name: 'Josh', age: 456
=> #<Foo:0x007fdeac02ecb0 @name="Josh", @age=456>
NB初期ミックスインは、我々は、我々がしたいカスタムの初期化を必要とするとを使用している場合ちょうどスーパーを呼び出す:
class Foo
include Initializable
attr_accessor :name, :age, :email, :gender, :height, :handler
def initialize(*)
super
self.handler = "#{self.name} #{self.age}"
end
end
Foo.new name: 'Josh', age: 45
=> #<Foo:0x007fe94c0446f0 @name="Josh", @age=45, @handler="Josh 45">
私は実際にはこの質問に対する答えは「いいえ」だと思う - 良い方法があるかもしれないが、より良い、よりイディオム的な方法があれば、以下に明確にアップ・投票された答えがあるだろう。 –