Ruby元程式設計 學習筆記 一 物件模型

2021-07-11 09:17:33 字數 3710 閱讀 3569

可以重新開啟已經存在的類並進行動態修改,即便是標準類庫也不例外

class

string

defmy_method

puts "this is my_method()"

endend

"str".my_method #=> this is my_method()

這種方式是不是很方便? 當然凡事都有利弊,帶來方便的同時也給我們帶來了一些問題:可能會對於類中已有的方法進行覆蓋,為了修復這樣的問題所使用的patch稱為猴子補丁.

"a".downcase    #=> "a"

class

string

defdowncase

puts "this is downcase() method"

endend

"a".downcase #=> this is downcase() method

所以,雖然開啟類技術非常方便,但是由於若是亂用可能會導致很大的問題.

class

myclass

defmy_method

@v = 1

endend

obj = myclass.new

總結: 乙個物件的例項變數存在與物件本身,而乙個物件的方法存在與物件自身的類.這也是為什麼同乙個類的物件共享者同樣的方法,但不共享例項變數的原因.

"hello".class

#=> string

string.class

#=> class

乙個物件的方法也就是其類的例項方法,也就是說乙個類的方法就是class的例項方法

class.instance_methods(false) #=>[:superclass,:allocate,:new]

new()方法用於建立物件

allocate

()方法是new

()的支撐方法

superclass

()返回乙個類的超類

所有類最終都繼承與object,object本身又繼承與basicobject, basicobject是ruby物件體系中的根結點.

string.superclass       # => object

object.superclass # => basicobject

basicobject.superclass # => nil

class.superclass

# => module

module.superclass # => object

所以,乙個類不過是乙個增加了三個方法的module.類和模組基本上是一樣的,絕大多數適用於類的情況也同樣適用於模組,反之亦然.

class

myclass ; end

obj1 = myclass.new

obj2 = myclass.new

上述**的模型圖如下:

load 與require

使用load(『test.rb』)可引用外部**, 但對於test.rb檔案所定義的變數和類會落在當前作用域之外,而常量則會落在當前作用域之類,這樣便會汙染當前程式的命名空間,不過可使用load(『test.rb』, true)強制其常量僅在自身範圍內有效.

require() 方法與load()相似,但load可以執行**,而require則是匯入類庫

總結:

類就是物件,只不過類名是常量[任何以大寫字母開頭的引用,包括類名和模組名].

當呼叫乙個方法時, ruby會做兩件事

1. 找到這個方法, 需要祖先鏈

2. 執行這個方法, 需要self

方法查詢: 首先在接收者的類中查詢,然後一層層在祖先鏈中查詢,直到找到該方法為止.

class

myclass

defmy_method; 'my_method()'; end

endclass

mysubclass

< myclass

endobj = mysubclass.new

obj.my_method()

mysubclass.ancestors # =>[mysubclass, myclass, object, kernel, basicobject]

當在乙個類(或模組)中包含乙個模組時,ruby建立乙個封裝該模組的匿名類,並將其插入到祖先鏈中.

module

m def

my_method

'm#my_method()'

endend

class

c include

mend

class

d< c

;end

d.new.my_method() # => "m#my_method()"

d.ancestors # => [d, c, m, object, kernel, basicobject]

kernel模組
如果給kernel模組增加乙個方法,這個核心方法就對所有物件可用.

每一行**都會在乙個當前物件中執行,可使用self關鍵字訪問當前物件.當呼叫乙個方法時,接收者就成為self, 這時所有的例項變數都是self 的例項變數,搜偶沒有明確指明接收者的方法都在self上呼叫.

self通常由最後乙個接受到方法的物件充當,但在類或模組定義中[任意方法定義之外], self由這個類或模組充當.

class

myclass

defself.my_method # =>類方法,self代表myclass

puts "self is #"

enddef

my_method # =>例項方法, self為接收者

puts "self is #"

endend

myclass.my_method # =>self is myclass

obj = myclass.new

obj.my_method # =>self is obj

不能明確指定乙個接收者來呼叫乙個私有方法, 但可通過send方法破壞私有性

ruby之一物件比較

ruby物件的比較有三種方式 1 比較兩個物件的值是否相等,返回 true,flase 等於 不等於 a 1 b 1.0 a b true2 比較兩個物件的值 型別是否相等,返回 true,flase eql?a 1 b 1.0 a.eql?b flase a為整數型,b為浮點型 3 比較兩個物件在...

一 物件模型

在ruby程式中,物件僅僅是其大世界的乙個公民而已,除了物件還有其他語言構件,比如類 class 模組 module 以及例項變數 imstance variable 等,元程式設計操控的就是這些語言構件。所有語言構件存在於其中的系統稱為物件模型,它是ruby的靈魂。1 物件由一組例項變數和乙個類的...

JAVA學習筆記之一(物件入門)

1 上溯造型 upcasting 把衍生型別當作他的基礎型別處理的過程 基礎型別shape有方法draw,erase等方法,circle,line,等型別是shape的衍生型別,函式dostuff對基礎型別物件做如下處理 void dostuff shape s s.draw s.erase 這個函...