• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

简单了解MetaprogramminginRuby

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

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

class Person

  #可带多个参数,用来自动生成参数的getter和setter方法
  attr_accessor :name, :age

  #只生成参数的getter方法
  attr_reader :height

  #只生成参数的setter方法
  attr_writer :height

end

p = Person.new
p.name = "hanks"
p.age = 20
p.height = 180
puts p.name

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

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

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

#往Class类中加入代码,Class类是所有类的基类,也就是这一操作
#会影响到所有的类,这里只是举例,要慎用!
class Class
  
  # *号表示参数个数可以是一个包含1个或者是任意多个元素的数组
  def my_attr_accessor(*args)

    #iterator循环,也就是对每一个参数做一些什么样的操作
    args.each do |arg|

      # getter的写法, %Q表示eval中的表达式可以多行
      self.class_eval %Q{

        # #{x}动态根据参数名构造函数名
        def #{arg}
          # @#{x}表示动态根据参数名构造私有变量
          return @#{arg}
        end

      }

      #setter的写法,一行的写法
      self.class_eval("def #{arg}=(val);@#{arg}=val;end")

    end

  end  

end

#用法如下
class Person
  my_attr_accessor :name, :age
end

p = Person.new
p.name = "hanks"
p.age = 20
puts p.name
puts p.age


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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Rubinius 2.0 发布,Ruby 虚拟机发布时间:2022-07-14
下一篇:
ruby -- 基础学习(六)时间计算发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap