0

私はこの興味深い答えを見つけました:

https://stackoverflow.com/a/2348854/169277

インスタンス変数を設定しようとしている場合、これは問題ありません。これは非常にうまく機能します。

同じロジックまたはより良いロジックを適用して、次のような汎用コンストラクターを作成する方法はありますか?

def initialize(obj)
  obj.each do |k,v|
   #find the setter for each k and set the value v to and return newly created object
  end
end

オブジェクトがあった場合TestObject:

class TestObject
attr_accessor :name, :surname, :sex
end

私はそれを次のようなものにすることを考えていました:

TestObject.new({:name => 'Joe', :surname => 'Satriani'})

どうすればこれを達成できますか?

したがって、これを行うと、次の省略形になります。

t = TestObject.new
t.name = 'Joe'
t.surname = 'Satriani'
4

3 に答える 3

0

これにはキーワード引数を使用する方が良いと思います。結局のところ、キーはメソッド名と一致する必要があるため、Hash有効な Ruby 識別子であることが保証されています。Symbolのキーとして任意の Ruby オブジェクトを渡す機能は必要ありませんHash

def initialize(**attrs)
  attrs.each do |attr, value| send(:"#{attr}=", value) end
end

TestObject.new(name: 'Joe', surname: 'Satriani')
于 2013-07-17T22:28:56.583 に答える