標籤:style blog io ar color os 使用 sp on
類的擴充和繼承
class Fixnum def dosome(str) puts str end def abs puts "覆蓋了原有的方法" endendputs 1.class1.dosome("動態添加的方法")1.abs#覆蓋原有的方法
freeze凍結對象
class Test attr_accessor :value endt=Test.newt.value=1a="test"a.freeze#a<<"1" 異常 a<<"1"或導致產生一個新的對象,a=a+"1"還是指向原有的對象a=a+"1"puts a#t.freeze 凍結不能在被修改,所以下面擴充修改該對象就會報錯TypeErrordef t.newmethod() puts "t的新方法"enddup=t.dupclone=t.clonet.value=2puts t.valuet.newmethodclone.newmethod#clone擷取到了為t定義的方法newmethod#dup.newmethod dup沒有獲得為t定義的方法newmethod=begindup和clone都能複製對象的內容資料,唯一不同的是clone方法還能保留與對象相關聯的方法等內容。dup和clone都是淺複製,如果對象中還包含了對其他對象的引用,將不會複製這些包含的對象,而只是複製了它們的引用。=end
序列化
class My_class attr_accessor :value enda=My_class.newa.value=123#擷取a的序列化字元tempa=Marshal.dump(a)puts tempa#通過序列化字元重建對象b=Marshal.load(tempa)puts b.classputs b.value
=begin
對象序列化方式不僅限於Marshal,還有其他方式,Marshal是Ruby內建的模組,效能還是比較出眾的
=end
模組
module MyModule def function puts "模組對象方法" end def self.function puts "模組方法" endendmodule MyModule def self.otherfunction puts "模組方法2" end CONST1="模組的常量" module MysubModule CONST1="子模組的常量" endend#p =MyModule.new#p.function 模組是沒有執行個體對象的概念的, 使用new 會拋出異常puts MyModule.classMyModule.functionMyModule.otherfunction#::來引用模組中的模組或者方法,可以看出清晰的階層關係,而不同模組中同名的常量或方法也不會造成衝突MyModule::functionputs MyModule::MysubModule::CONST1
載入模組(require,load,include,extend)
#load(‘testxml.rb‘, wrap) #載入testxml.rb檔案#require ‘testxml‘ #載入testxml庫,通常也是載入testxml.rb檔案=beginload和require都是載入相應的模組檔案到當前的環境中,load會無條件的載入源檔案,不管之前是否載入過。require則會檢查,保證模組只被載入過一次,經常用於載入一些擴充庫。require和load載入後,被負載檔案中的局部變數不會載入進來如果傳入的檔案不包含路徑,會在當前載入的目錄下尋找搜尋=endmodule MyModule def method puts "method" endendclass MyClass include MyModule #因為include作用為混入模組其作用等價於# def method# puts "method"# endendclass MyClass1 extend MyModule #exted方法所擴充的對象取決於調用extend方法的對象,需要注意的是該處的extend,本質上等價於self.extend MyModule #這裡的代碼中的self指代的是MyClass1類,所以MyModule被定義為MyClass1的類方法# def self.method# puts "method"# endendmy_class=MyClass.new#類中使用include 模組中的方法變成 類的執行個體方法my_class.method#類中使用extend 模組中的方法變成了 類的方法MyClass1.methodaa="0"#所有對象都可以extend模組而活的模組中的方法,因為aa變數所引用的是一個字串對象的執行個體,extend所調用的對象為執行個體對象#因此extend起作用的也是執行個體對象aa.extend(MyModule)aa.method=begininclude和extend不會自動負載檔案,他們只是將模組混入貨擴充已有的模組或類。include會建立一個由類到所包含模組的引用,自動添加為類的執行個體方法,當模組發生改變是,類中所混入的放發也會發生相應的改變extend和inc極其相似,不過extend是用來在一個對象中引入一個模組,使得這個對象也具有這個模組的方法。=end
Ruby類,模組1