ruby - 元编程 : custom initialize

标签 ruby class metaprogramming

我必须在 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 ,并为该模块定义方法。在本例中,模块是 CObject#instance_variable_set 方法接受一个实例变量名和一个值并设置它。在这种情况下,Object 的实例将是 C 的实例。

顺便说一句,最好避免使用将一串代码传入进行评估的方法。我建议改为传递 block 。

关于ruby - 元编程 : custom initialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27028821/

相关文章:

c++ - 如何在 C++ 中引用类结构中的函数?

php - PHP 中 $this->$variable 语法不明确

关于选民投票率的Python分配问题: class and object and function

c++ - 模板 SFINAE 在 conditional_t 内

ruby - 如何使用 Mechanize 从 html 页面上的 'td' 标签中获取 'table' 标签中的文本

ruby-on-rails - ActiveSupport 中 mattr_accessor 和 cattr_accessor 的区别?

c++ - 为其他容器实现 std::rank

python - 如何确定哪些 namespace 对 Python 堆栈框架可见?

ruby-on-rails - Rails 迁移不适用

ruby-on-rails - Basic rails - link_to 如何工作并将其替换为渲染