Как динамически инициализировать любые аргументы в Ruby?

Как динамически инициализировать любые аргументы в 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на лету, чтобы я мог читать и писать в любую из этих переменных экземпляра.

Примечание: здесь есть некоторые крайние случаи, убедитесь, что они подходят для вашей конкретной ситуации, но я думаю, что это хорошее начало.