Как динамически инициализировать любые аргументы в Ruby?
Реализация, представленная ниже, очень удобна, когда вас не очень интересует количество или качество аргументов, которые вы устанавливаете (может быть, вы создаете прототипы или используете сторонний API?)
Довольно просто, вот код:
class MPB def initialize(*args) args[0].each do |key,value| singleton_class.class_eval { attr_accessor "#{key}" } eval("@#{key} = "#{value}"") # alternatively you can use this helper: instance_variable_set("@#{key}", value) end end end mpb = MPB.new(author: 'Anatoly', title: 'How to dynamically initialize args',body: "Read More!") p mpb # => #<MPB:0x00007f81fc0af250 @author="Anatoly", @title="How to dynamically initialize args", @body="Read More!">
Быстрое объяснение, что я делаю здесь:
initialize()
позволяет нам получить *args
, что пятерых нас Hash
от аргументов, которые вы передаете ему. Я прохожу этот хеш и создаю переменную экземпляра каждого хеш-ключа, затем присваиваю значение этому хеш-ключу. Абсолютно динамичный. Я также создаю attribute_accessor
на лету, чтобы я мог читать и писать в любую из этих переменных экземпляра.
Примечание: здесь есть некоторые крайние случаи, убедитесь, что они подходят для вашей конкретной ситуации, но я думаю, что это хорошее начало.