Ruby 我正在努力实现预期的输出,但未能为下面的问题语句创建可重用的代码。有什么建议吗?

Ruby 我正在努力实现预期的输出,但未能为下面的问题语句创建可重用的代码。有什么建议吗?,ruby,metaprogramming,Ruby,Metaprogramming,动态定义一个类。类名称应通过标准inputcommand行从用户处获取 然后提示用户输入方法名和一行代码。该方法应使用用户输入的代码在上述类中动态定义为实例方法。 告诉用户类和方法已定义。 然后调用这个实例方法并显示结果 我想做的是- 使用initialize方法创建一个类,该方法采用动态类名方法,然后在其中创建类,然后仅在initialize方法中创建该类的实例。然后将其分配给类实例变量,并在该实例上调用greet方法/动态方法。 但在这个过程中失败了。 我想用OOPS实现这一点,主要问题是接

动态定义一个类。类名称应通过标准inputcommand行从用户处获取 然后提示用户输入方法名和一行代码。该方法应使用用户输入的代码在上述类中动态定义为实例方法。 告诉用户类和方法已定义。 然后调用这个实例方法并显示结果

我想做的是- 使用initialize方法创建一个类,该方法采用动态类名方法,然后在其中创建类,然后仅在initialize方法中创建该类的实例。然后将其分配给类实例变量,并在该实例上调用greet方法/动态方法。 但在这个过程中失败了。 我想用OOPS实现这一点,主要问题是接受用户输入并将其分配给动态方法和类

class MethodCreator
  @my_class_instance_var = ""

  class << self
    attr_accessor :my_class_instance_var
   end

  def initialize(class_name)
    cl = Class.new
    @my_class_instance_var = Object.const_set(class_name, cl)
  end
  def create_method(method_name, code_str)
    self.class.define_method(method_name, code_str)
  end
end

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

obj = MethodCreator.new(class_name)

obj.my_class_instance_var.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}"

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

找到了解决这个问题的方法。我会很高兴,如果这可以帮助一些人,谁是挣扎与元编程像我一样

class MethodCreator
  def initialize(class_name)
    @klass = Class.new
    Object.const_set(class_name, @klass)
  end
  def new_method(method_name, code_str)
    @klass.instance_eval do
        define_method(method_name) { instance_eval(code_str)}
    end
  end
  def call(method_name)
    @klass.new.send(method_name)
  end
end

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

obj = MethodCreator.new(class_name)

obj.new_method(method_name, code_str)
puts obj.call(method_name)