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