我必须在 Class
类中编写一个 my_initialize
方法,以便它在这个庄园中工作,当在另一个类中使用时:
类 Person
my_initialize :name, :surname
结束
相当于:
类 Person
def 初始化(名字,姓氏)
@name, @surname = 名字, 姓氏
结尾
结束
如果传递了错误数量的参数,它还必须引发 ArgumentError
。例如 Person.new("Mickey")
是无效的。我知道我的代码应该类似于:
class Class
def my_initialize(*args)
args.each do |arg|
self.class_eval("?????")
end
end
end
我刚开始阅读元编程,但找不到对我的问题有用的内容。有什么想法可以完成这项任务吗?
最佳答案
class Class
def my_initialize(*vars)
define_method :initialize do |*args|
if args.length != vars.length
raise ArgumentError, 'wrong number of arguments'
end
vars.zip(args).each do |var, arg|
instance_variable_set :"@#{var}", arg
end
end
end
end
class C
my_initialize :a, :b
end
Module#define_method
方法采用方法名称和 block ,并为该模块定义方法。在本例中,模块是 C
。 Object#instance_variable_set
方法接受一个实例变量名和一个值并设置它。在这种情况下,Object
的实例将是 C
的实例。
顺便说一句,最好避免使用将一串代码传入进行评估的方法。我建议改为传递 block 。
关于ruby - 元编程 : custom initialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27028821/