Создан генератор классов и функций dyanmi c, но часть method_body не работает - PullRequest
1 голос
/ 15 января 2020
class DynamicClass
  def initialize(class_name)
    @class_name = class_name
    Object.const_set class_name, Class.new
  end
  def def_method(method_name,method_body)
   Object.const_get(@class_name).send(:define_method, method_name, Proc.new{method_body} )
  end

  def call(method_name)
    puts "Hello, Your class #{@class_name} with method #{method_name} is ready. Calling: #{@class_name}.new.#{method_name}:"
    Object.const_get(@class_name).new.send(method_name)
  end
end

p 'Please enter the class name: '
class_name = gets.chomp
p 'Please enter the method name you wish to define: '
method_name = gets.chomp
p "Please enter the method's code: "
method_body = gets


n =DynamicClass.new(class_name)
n.def_method(method_name,method_body)
puts n.call(method_name)

Ожидаемый вывод:

Please enter the class name: User
Please enter the method name you wish to define: greet
Please enter the method's code: "Welcome from #{self.class} class. I am #{self}"

Hello, Your class User with method greet is ready. Calling: User.new.greet:
"Welcome from User class. I am <User#123456>"

Фактический вывод

"Пожалуйста, введите имя класса:" Пользователь

"Пожалуйста, введите название метода, который вы будете sh для определения: "greet

" Пожалуйста, введите код метода: "Welcome from # {self.class} class. Я # {self}

Здравствуйте, Ваш класс Пользователь с методом greet готов. Вызов: User.new.greet:

Добро пожаловать из класса # {self.class}. Я # {self}

method_body не выполняет интерполяцию строк .., я думаю, что ошибка использует метод get, есть идеи? ..

1 Ответ

1 голос
/ 15 января 2020

Вы почти у цели! Просто выполните оценку , чтобы выполнить интерполяцию строки.

def def_method(method_name,method_body)
  Object.const_get(@class_name).send(:define_method, method_name, Proc.new{eval('"' + method_body + '"')} )
end
...