創(chuàng)建類(lèi): class后跟類(lèi)名,其中類(lèi)名的首字母必須要大寫(xiě)。實(shí)例化時(shí),通過(guò)new方法實(shí)例化。在c#中有構(gòu)造器,構(gòu)造器與類(lèi)同名。在ruby中,構(gòu)造器為initialize方法。當(dāng)通過(guò)new方法實(shí)例化一個(gè)類(lèi)對(duì)象后,會(huì)自動(dòng)調(diào)用initialize方法,把new中的參數(shù)傳遞給initialize方法進(jìn)行初始化。在c#中的域,在ruby中稱(chēng)為實(shí)例變量,定義時(shí)前邊加@前綴,表示是一個(gè)實(shí)例變量。
class Customer
def initialize(name,age)
@name,@age=name,age
end
end
c1=Customer.new("Tom",20)
訪問(wèn)器
實(shí)例變量只能通過(guò)實(shí)例方法來(lái)訪問(wèn)。如果要訪問(wèn)它們可以提供方法訪問(wèn)器。在c#中稱(chēng)為屬性,Java中也是定義方法來(lái)表示屬性。
class Customer
def initialize(name,age)
@name,@age=name,age
end
def name
@name
end
def age
@age
end
end
以上定義了兩個(gè)方法x,y,它們可以讀@x,@y實(shí)例變量。這就定義了讀屬性方法。如果要進(jìn)行賦值操作,還要定義寫(xiě)屬性方法:
def name=(v)
@name=v
end
def age=(v)
@age=v
end
要注意的是:
c1=Customer.new("Tom",20)
c1.name="Jhon"
只有在實(shí)例中才能這樣使用寫(xiě)屬性。如果在類(lèi)中,不能通過(guò)name=value這樣來(lái)代替@name=value。但可以通過(guò)self來(lái)這樣使用:self.name=value
Ruby提供了簡(jiǎn)化定義屬性方法:attr_reader和attr_accessor。后邊跟符號(hào),會(huì)自動(dòng)創(chuàng)建同名的讀寫(xiě)屬性。
class Customer
def initialize(name,age)
@name,@age=name,age
end
attr_reader :name,:age
attr_accessor:name,:age
end
c1=Customer.new("Tom",20)
puts c1.name,c1.age
c1.name="Jhon"
c1.age=30
puts c1.name,c1.age
類(lèi)變量,常量,類(lèi)方法
類(lèi)變量以@@開(kāi)頭;常量通過(guò)[類(lèi)名+::常量名]進(jìn)行訪問(wèn);類(lèi)方法在實(shí)例方法方法名前加類(lèi)名。在定義類(lèi)方法時(shí),可以采用一種方式:
class<<self
def 方法
end
end
那么,這個(gè)方法就是一個(gè)類(lèi)方法:
class Customer
def initialize(name,age)
@name,@age=name,age
end
class <<self
def showName
'ok'
end
end
end
puts Customer.showName
方法的訪問(wèn)性
public:公有的,默認(rèn)情況下類(lèi)中的方法是公有的,可以用在任何地方。構(gòu)造方法initialize為私有的。
private:私有的,類(lèi)內(nèi)部使用的,只能被類(lèi)或子類(lèi)的實(shí)例方法所調(diào)用。只能通過(guò)self隱式調(diào)用,不能通過(guò)一個(gè)對(duì)象顯示調(diào)用。一個(gè)私有方法m,只能通過(guò)m調(diào)用,而不能通過(guò)o.m或self.m調(diào)用。
protected:受保護(hù)的,類(lèi)內(nèi)部或子類(lèi)內(nèi)部使用的方法。與私有的區(qū)別是:除self隱式調(diào)用外,還可以通過(guò)該類(lèi)對(duì)象顯示調(diào)用。
可以通過(guò)以下方法來(lái)聲明方法的訪問(wèn)性:
#訪問(wèn)性 private protected public
private
def private_method
puts "private method testing"
end
protected
def protected_method
puts "protected method testing"
end
public:protected_method
工廠方法
使用new方法私有,然后通過(guò)類(lèi)方法創(chuàng)建實(shí)例
class Fruit
private_class_method:new
def Fruit.CreateFruit
new Fruit
end
end
f=Fruit.CreateFruit
模塊module
module作用之一是做為名字空間用。調(diào)用類(lèi)時(shí)與調(diào)用常量相同:兩個(gè)冒號(hào)
另一作用是作為混入。通過(guò)include把模塊中的實(shí)例方法包含到其它類(lèi)中。感覺(jué)功能像C#中的名字空間引入。