首页 > 解决方案 > 下面的动态方法调用代码怎么写?

问题描述

动态定义一个类。类名应通过标准输入(命令行)从用户处获取

然后提示用户输入方法名称和一行代码。该方法应使用用户输入的代码动态定义为上述类中的实例方法。

告诉用户类和方法已定义。然后调用这个实例方法并显示结果。

我能够动态创建类,但之后我无法继续。

class Ancestor; end
SomeClass = Class.new(Ancestor) do
  def initialize(var)
     print "#{self.class} initialized with #{var}"
  end
end

class << self
 define_method :new_dynamic_method do
    "content goes here"
 end
end

puts a = SomeClass.new(ARGV[0])

代码应该是面向对象的。

预期结果 :

请输入班级名称:用户

请输入您要定义的方法名称:greet

请输入方法代码:“Welcome from #{self.class} class. I am #{self}”

- - 结果 - -

您好,您的类 User 与方法 greet 已准备就绪。调用:User.new.greet:“欢迎来自用户类。我是”

调用 API 应该类似于:

my_class = DynamicClass.new(class_name)
my_class.def_method(method_name, method_body)
my_class.def_method(another_method_name, method_body)
...
...

my_class.call(method_name)
my_class.call(another_method_name)

标签: rubydynamicmetaprogramming

解决方案


让我们只看核心问题,不是从用户那里获取输入或显示信息以供用户阅读。我们从用户那里获得以下信息:

class_name  = "User"
method_name = "greet"
code_str    = "Welcome from #{self.class} class. I am #{self}"
  #=> "Welcome from Object class. I am main"

创建一个类:

cl = Class.new
  #=> #<Class:0x0000563cd2e3d748> 

给类命名:

Object.const_set(class_name, cl)
  #=> User

为该类创建一个实例方法:

cl.define_method(method_name) { code_str }
  #=> :greet 

确认已创建类并列出该类拥有的实例方法:

User.is_a? Class
  #=> true

User.instance_methods(false)
  #=> [:greet]

执行类的实例方法1

User.new.greet
  #=> "Welcome from Object class. I am main"

请参阅Class::newModule#const_setModule#define_methodModule#instance_methods

1. 问题的设置者可能想要User.new.greetreturn "Welcome from User class. I am #<User:0x00005cb777dca6f0> ",但这不可能,因为在分配#{self}时已评估为其当前值code_str,如上所示。


推荐阅读