简单了解Metaprogramming in Ruby

后端开发   发布日期:2025年06月27日   浏览次数:106

Metaprogramming是ruby的一个特性,可以动态的修改语言结构,比如类结构,模块结构和实例变量信息等等。

甚至可以在运行时往程序中加入并运行新的代码而不需要重启你的程序。

1. 本篇中先简单了解attr_accessor, attr_reader和attr_writer的用法

  1. class Person
  2. #可带多个参数,用来自动生成参数的getter和setter方法
  3. attr_accessor :name, :age
  4. #只生成参数的getter方法
  5. attr_reader :height
  6. #只生成参数的setter方法
  7. attr_writer :height
  8. end
  9. p = Person.new
  10. p.name = "hanks"
  11. p.age = 20
  12. p.height = 180
  13. puts p.name

2. 内部实现原理是什么样的?

在Ruby中,动态代码的实现是通过一系列的”eval”方法实现的,常用的有eval, instance_eval, class_eval, module_eval

四种,在这里我们将使用class_eval(往class中加入可执行代码)。代码如下:

  1. #往Class类中加入代码,Class类是所有类的基类,也就是这一操作
  2. #会影响到所有的类,这里只是举例,要慎用!
  3. class Class
  4. # *号表示参数个数可以是一个包含1个或者是任意多个元素的数组
  5. def my_attr_accessor(*args)
  6. #iterator循环,也就是对每一个参数做一些什么样的操作
  7. args.each do |arg|
  8. # getter的写法, %Q表示eval中的表达式可以多行
  9. self.class_eval %Q{
  10. # #{x}动态根据参数名构造函数名
  11. def #{arg}
  12. # @#{x}表示动态根据参数名构造私有变量
  13. return @#{arg}
  14. end
  15. }
  16. #setter的写法,一行的写法
  17. self.class_eval("def #{arg}=(val);@#{arg}=val;end")
  18. end
  19. end
  20. end
  21. #用法如下
  22. class Person
  23. my_attr_accessor :name, :age
  24. end
  25. p = Person.new
  26. p.name = "hanks"
  27. p.age = 20
  28. puts p.name
  29. puts p.age

目前有关四种eval的用法的区别还不是太了解,继续学习啊~~

以上就是简单了解Metaprogramming in Ruby的详细内容,更多关于简单了解Metaprogramming in Ruby的资料请关注九品源码其它相关文章!