Я вижу пару вещей неправильно:
Не уверен, действительно ли ваши классы выглядят так, но вам понадобится end
в конце, иначе вы получите синтаксические ошибки.
Кроме того, constantize
- это не метод для строк в Ruby, это то, что определяет Rails. Так что вам нужно будет использовать
Kernel.const_get(demo_name.to_s)
, чтобы получить ту же функциональность.
Как указано в комментариях, я не упомянул, как расширить параметры.
Для этого вам нужно использовать так называемый «оператор сплат»
Kernel.const_get(demo_name.to_s).send(:new,*args) #notice the * in front of args
Это расширит аргументы.
Однако, когда args является хешем, скажем, {:text=>"hello", :text2=>"hello2"}
, он расширит его до массива с 2 элементами, где каждый элемент является массивом, в котором они вводят первую позицию и вводят во вторую позицию.
Вместо этого, если вы передадите массив как args
с упорядоченными объектами, вы получите то, что ищете.
Я думаю, что если вы собираетесь узнать, что означает именованные параметры, вам, возможно, придется попробовать другой маршрут, но я точно не знаю.
Чтобы использовать необязательные или именованные параметры, вы можете посмотреть, как это делает Rails: использовать хеш для параметра, а затем передать хеш с ключами. Затем вы можете сохранить действительный список ключей и проверить переданный хэш и либо отклонить их, либо выдать ошибку.