ruby - 下面的动态方法调用代码怎么写?
问题描述
动态定义一个类。类名应通过标准输入(命令行)从用户处获取
然后提示用户输入方法名称和一行代码。该方法应使用用户输入的代码动态定义为上述类中的实例方法。
告诉用户类和方法已定义。然后调用这个实例方法并显示结果。
我能够动态创建类,但之后我无法继续。
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)
解决方案
让我们只看核心问题,不是从用户那里获取输入或显示信息以供用户阅读。我们从用户那里获得以下信息:
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::new和Module#const_set、Module#define_method和Module#instance_methods。
1. 问题的设置者可能想要User.new.greet
return "Welcome from User class. I am #<User:0x00005cb777dca6f0> "
,但这不可能,因为在分配#{self}
时已评估为其当前值code_str
,如上所示。
推荐阅读
- django - 使用 Q 对象时如何对查询结果进行排名
- c# - 如何在 mdi 父窗体中的另一个子窗体上使用按钮打开子窗体
- c# - 使用带有@html.DropDownList 的简单列表
- python - 无法在python中打印列表值
- java - java 1.7 中的标志参数无效
- laravel - Laravel Cashier (Stripe) 使用带有令牌的现有客户订阅
- docker - Nginx 反向代理到 HTTPS 上游得到 502 Bad Gateway?
- scikit-learn - 为什么 SVC、NuSVC 和 LinearSVC 会产生截然不同的结果?
- unix - 如何使用 egrep 查找重复的字符簇(例如 abc-abc-abc)?
- mysql - 如何将存储在 MySQL 单元中的代码输入我的 Python beautifulsoup