簡單瞭解Metaprogramming in Ruby

來源:互聯網
上載者:User

Metaprogramming是ruby的一個特性,可以動態修改語言結構,比如類結構,模組結構和執行個體變數資訊等等。

甚至可以在運行時往程式中加入並運行新的代碼而不需要重啟你的程式。

1. 本篇中先簡單瞭解attr_accessor, attr_reader和attr_writer的用法
class Person  #可帶多個參數,用來自動產生參數的getter和setter方法  attr_accessor :name, :age  #只產生參數的getter方法  attr_reader :height  #只產生參數的setter方法  attr_writer :heightendp = Person.newp.name = "hanks"p.age = 20p.height = 180puts 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, :ageendp = Person.newp.name = "hanks"p.age = 20puts p.nameputs p.age

目前有關四種eval的用法的區別還不是太瞭解,繼續學習啊~~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.