元編程能夠用來完成如下工做:編程
(1)編寫一個Ruby程序來連接外部系統,使用元編程,能夠編寫一個包裝器來接受任何方法調用,若是後來外部系統調價了方法,無需修改包裝器,他會馬上自動支持這些新加入的方法ui
(2)當遇到須要使用某種特定的語言來解決問題的時候,使用Ruby定義領域專屬語言,能夠不用本身定製解析器spa
(3)大量下降重複代碼,如一些方法名以及功能相識的方法,可使用元編程方便的實現code
(4)須要去加強核心類時,使用ruby元編程能夠輕鬆修改對象
class關鍵字,在類還未定義時,用於定義一個類,在類已存在時,用於打開一個類,或者說class關鍵字更像做用域操做符,將你帶到類的上下文中。資源
對象中包含了實例變量和方法:作用域
(1)實例變量:class
對象中包含了實例變量,能夠經過Object#instance_variables()方法查看對象的實例變量;與Java不同,Ruby中對象的類和它的實例變量沒有關係,當給實例變量賦值時,它們就生成了require
(2)方法:變量
經過調用Object#methods()方法,能夠得到一個對象的方法列表,實例方法實際上是放在類對象中
常量:任何一大寫字母開頭的引用(包括類名和模塊名),都是常量。
類與模塊對比:模塊基本上就是一組實例方法,而類時一個增長了若干功能(superclass()方法和new()方法)的模塊, module用來作命名空間,或者在某處被include,extend;(superclass()方法和new()方法是Class的實例方法)
Module類提供了兩個constants()方法,其中一個是實例方法,另外一個是類方法,Module#constants()(實例方法)返回當前範圍的常量,而Module.constants()(類方法)返回程序中全部頂級常量,包括類名,例:
module M Y = 'another constant' class C X = 'constant' Module.nesting # => [M::C, M] end end M.constants # => [:Y, :C] Module.constants[0..1] # => [:Object, :Module]
使用Module.nesting()方法能夠得到當前代碼調用出上級的命名空間
load與require的區別:
(1)load引入同一個文件時會重複加載,require只引入一次
(2)load有第二參數load('motd.rb', true),強制引入常量只在自身範圍內有效,經過這種方式加載文件,Ruby會建立一個匿名的模塊,使用它做爲命名空間來容納引入文件的全部常量,加載完成後,該模塊會被銷燬(默認false)
load、require、include、extend 區別:
(1)load,require用來加載資源;include,extend用來導入module(文件中必須是module定義,否則拋異常)
(2)load第二個參數不爲true時與require效果類似,但運用場景不一樣,load用來執行某段外部文件中的代碼,require用來導入類庫
(3)include將module中的方法做爲調用處的實例方法,extend將module中的方法做爲調用出的類方法
當調用一個方法的時候,Ruby須要作兩件事情:首先,找到這個方法;而後,執行這個方法
(1)找到方法
在使用對象的類的ancestors()方法能夠查看祖先鏈,一個對象的祖先鏈按照向右一步再向上規則,若是類中引用了模塊,模塊的位置在該類以後,若引入了多個模塊,最後一個引入的模塊在最前面
(2)執行方法
只要調用某個對象的方法時,那個對象就成爲self,不過在類和模塊定義中而且在任何方法定製以外self的角色有這個類或模塊擔當
private關鍵字表示下面的方法只能用隱含接受者--self調用