可以重新開啟已經存在的類並進行動態修改,即便是標準類庫也不例外
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 這個函...