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的用法的區別還不是太瞭解,繼續學習啊~~