ruby 學(xué)習(xí)筆記(2) 類的基本使用
更新時間:2010年02月26日 16:12:34 作者:
ruby 學(xué)習(xí)筆記(2) 類的基本使用
ruby語言跟c#的一些重要差別在于:
1.ruby是動態(tài)語言,c#是靜態(tài)語言--即對象在new出來以后,ruby還可以動態(tài)給對象實(shí)例添加一些屬性或方法(javascript也是如此)
2.ruby中刻意弱化了變量類型這個概念,默認(rèn)情況下變量/方法都不需要聲明具體(返回)類型,但其實(shí)在ruby內(nèi)部,會自動根據(jù)變量的值分配類型。(可以通過 “puts 變量.class“查看)
3.ruby相對c#來講,可能有些雷的地方在于:父類中的private成員,居然是可以在子類中使用的!
...其它地方,等學(xué)習(xí)深入了再寫出來
最后上一段測試代碼,展示了ruby中類的基本用法:
class People #跟javascript這類動態(tài)語言一樣,ruby中的類也沒有public,private這類訪問控制標(biāo)識符
def initialize(_name) #構(gòu)造函數(shù),名字是固定:initialize
@name = _name; #約定:類的私有變量以@開頭
end
def to_string #類似C#中的做法,這里寫一個ToString方法的ruby版
"My name is #{@name}" #ruby中方法最后一行的值,會被當(dāng)作函數(shù)值返回
end
def get_name_size
return @name.length #這個方法中返回的是數(shù)字型(即名稱的長度)
end
def test #類定義的最后部分,把這個方法標(biāo)記為私有方法了
puts "private method(test) in People."
end
def show_name
test #私有方法,可在內(nèi)部調(diào)用
puts "name = #{@name}"
end
attr_accessor:name #定義一個可讀寫的屬性,這里也體現(xiàn)了ruby的一個重要思想:約定重于規(guī)范,因?yàn)锧name在之前已經(jīng)使用過,這里的屬性只需要把@去掉,ruby就會自動智能的生成類似c#中 set{value = @name},get{return @name}的語句
private:test #標(biāo)明test方法是private屬性的
protected:get_name_size #標(biāo)明get_name_size只能在本類或子類定義中使用(或者在子類定義中賦值給子類實(shí)例)
end
aPeople = People.new("jimmy");#創(chuàng)建一個People的實(shí)例
puts aPeople.to_string #調(diào)用to_string方法
#puts aPeople.get_name_size #將報錯,因?yàn)樵摲椒ㄊ鼙Wo(hù)
#puts aPeople.test #將報錯,因?yàn)樵摲椒ㄊ撬接蟹椒?
aPeople.show_name
puts aPeople.name
aPeople.name = "楊俊明" #修改姓名
aPeople.show_name
#再定義一個子類
class Man < People
def initialize(_name)
super
@sex = true
end
attr_reader:sex #定義只讀屬性sex
def call_protected_method
puts get_name_size #調(diào)用父類的受保護(hù)方法
end
def call_protected_method2(man1)
puts man1.get_name_size #注意這里:這里可以把父類的受保護(hù)方法,動態(tài)添加到子類實(shí)例
end
def call_private_method #子類可以調(diào)用父類的私有方法!!! 這一點(diǎn)剛開始很不習(xí)慣
test
end
def call_private_method2(man1)
man1.test #注意這里:語法檢查雖然可以通過,但是運(yùn)行時會提示私有方法無法調(diào)用,這也是private與protected的區(qū)別
end
end
puts "******************************"
aMan = Man.new("jimmy.yang");
aMan.show_name
aMan.call_protected_method
puts aMan.sex
aMan.call_private_method
aMan2 = Man.new("Mike")
aMan.call_protected_method2(aMan2);
#aMan.call_private_method2(aMan2);
a = "abc";
#aMan.call_protected_method2(a); #雖然ruby本身對變量沒有類型概念,但是這樣卻不行,即:在調(diào)用父類的受保護(hù)方法時,其實(shí)是要類型匹配的
puts aMan.class #顯示aMan的類名稱
運(yùn)行結(jié)果如下:
>ruby classDemo.rb
My name is jimmy
private method(test) in People.
name = jimmy
jimmy
private method(test) in People.
name = 楊俊明
******************************
private method(test) in People.
name = jimmy.yang
10
true
private method(test) in People.
4
Man
>Exit code: 0
作者:菩提樹下的楊過
出處:http://yjmyzz.cnblogs.com
1.ruby是動態(tài)語言,c#是靜態(tài)語言--即對象在new出來以后,ruby還可以動態(tài)給對象實(shí)例添加一些屬性或方法(javascript也是如此)
2.ruby中刻意弱化了變量類型這個概念,默認(rèn)情況下變量/方法都不需要聲明具體(返回)類型,但其實(shí)在ruby內(nèi)部,會自動根據(jù)變量的值分配類型。(可以通過 “puts 變量.class“查看)
3.ruby相對c#來講,可能有些雷的地方在于:父類中的private成員,居然是可以在子類中使用的!
...其它地方,等學(xué)習(xí)深入了再寫出來
最后上一段測試代碼,展示了ruby中類的基本用法:
復(fù)制代碼 代碼如下:
class People #跟javascript這類動態(tài)語言一樣,ruby中的類也沒有public,private這類訪問控制標(biāo)識符
def initialize(_name) #構(gòu)造函數(shù),名字是固定:initialize
@name = _name; #約定:類的私有變量以@開頭
end
def to_string #類似C#中的做法,這里寫一個ToString方法的ruby版
"My name is #{@name}" #ruby中方法最后一行的值,會被當(dāng)作函數(shù)值返回
end
def get_name_size
return @name.length #這個方法中返回的是數(shù)字型(即名稱的長度)
end
def test #類定義的最后部分,把這個方法標(biāo)記為私有方法了
puts "private method(test) in People."
end
def show_name
test #私有方法,可在內(nèi)部調(diào)用
puts "name = #{@name}"
end
attr_accessor:name #定義一個可讀寫的屬性,這里也體現(xiàn)了ruby的一個重要思想:約定重于規(guī)范,因?yàn)锧name在之前已經(jīng)使用過,這里的屬性只需要把@去掉,ruby就會自動智能的生成類似c#中 set{value = @name},get{return @name}的語句
private:test #標(biāo)明test方法是private屬性的
protected:get_name_size #標(biāo)明get_name_size只能在本類或子類定義中使用(或者在子類定義中賦值給子類實(shí)例)
end
aPeople = People.new("jimmy");#創(chuàng)建一個People的實(shí)例
puts aPeople.to_string #調(diào)用to_string方法
#puts aPeople.get_name_size #將報錯,因?yàn)樵摲椒ㄊ鼙Wo(hù)
#puts aPeople.test #將報錯,因?yàn)樵摲椒ㄊ撬接蟹椒?
aPeople.show_name
puts aPeople.name
aPeople.name = "楊俊明" #修改姓名
aPeople.show_name
#再定義一個子類
class Man < People
def initialize(_name)
super
@sex = true
end
attr_reader:sex #定義只讀屬性sex
def call_protected_method
puts get_name_size #調(diào)用父類的受保護(hù)方法
end
def call_protected_method2(man1)
puts man1.get_name_size #注意這里:這里可以把父類的受保護(hù)方法,動態(tài)添加到子類實(shí)例
end
def call_private_method #子類可以調(diào)用父類的私有方法!!! 這一點(diǎn)剛開始很不習(xí)慣
test
end
def call_private_method2(man1)
man1.test #注意這里:語法檢查雖然可以通過,但是運(yùn)行時會提示私有方法無法調(diào)用,這也是private與protected的區(qū)別
end
end
puts "******************************"
aMan = Man.new("jimmy.yang");
aMan.show_name
aMan.call_protected_method
puts aMan.sex
aMan.call_private_method
aMan2 = Man.new("Mike")
aMan.call_protected_method2(aMan2);
#aMan.call_private_method2(aMan2);
a = "abc";
#aMan.call_protected_method2(a); #雖然ruby本身對變量沒有類型概念,但是這樣卻不行,即:在調(diào)用父類的受保護(hù)方法時,其實(shí)是要類型匹配的
puts aMan.class #顯示aMan的類名稱
運(yùn)行結(jié)果如下:
復(fù)制代碼 代碼如下:
>ruby classDemo.rb
My name is jimmy
private method(test) in People.
name = jimmy
jimmy
private method(test) in People.
name = 楊俊明
******************************
private method(test) in People.
name = jimmy.yang
10
true
private method(test) in People.
4
Man
>Exit code: 0
作者:菩提樹下的楊過
出處:http://yjmyzz.cnblogs.com
您可能感興趣的文章:
- Ruby學(xué)習(xí)筆記之gem 命令詳解
- Ruby rails 頁面跳轉(zhuǎn)(render和redirect_to)
- Ruby 字符串處理
- RUBY 新手教程 跟我一起學(xué)ruby
- 學(xué)習(xí)Ruby你需要了解的相關(guān)知識(rvm, gem, bundle, rake, rails等)
- Ruby中執(zhí)行Linux shell命令的六種方法詳解
- 淘寶網(wǎng)提供的國內(nèi)RubyGems鏡像簡介和使用方法
- 二十分鐘 教你Ruby快速入門 圖文教程
- 詳解Ruby中正則表達(dá)式對字符串的匹配和替換操作
- Ruby Gems更換淘寶源方法
- Windows下Ruby on Rails開發(fā)環(huán)境安裝配置圖文教程
- ruby 異常處理:rescue
- CentOS 6.3下編譯安裝Ruby 2.0筆記
- Ruby中的return、break、next詳解
- 舉例講解Ruby中require的使用方法
- 更改RubyGem安裝源
- 使用Ruby來處理JSON的簡單教程
- Ruby信號處理詳解
相關(guān)文章
Ruby實(shí)現(xiàn)批量對文件增加前綴代碼分享
這篇文章主要介紹了Ruby實(shí)現(xiàn)批量對文件增加前綴代碼分享,本文給出實(shí)現(xiàn)代碼、使用方法、使用示例等內(nèi)容,需要的朋友可以參考下2015-01-01Ruby中使用mechanize批量下載校內(nèi)網(wǎng)相冊照片
這篇文章主要介紹了Ruby中使用mechanize批量下載校內(nèi)網(wǎng)相冊照片,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01詳解Ruby中的instance_eval方法及其與class_eval的對比
Ruby的eval族方法將字符串作為代碼來執(zhí)行,instance_eval方法便是其中之一,下面就來詳解Ruby中的instance_eval方法及其與class_eval的對比2016-05-05Ruby on Rails所構(gòu)建的應(yīng)用程序基本目錄結(jié)構(gòu)總結(jié)
Ruby on Rails是Ruby世界中一家獨(dú)大的Web開發(fā)框架,要掌握Rails程序的構(gòu)建,對其目錄結(jié)構(gòu)的了解十分必要,下面就來看一下Ruby on Rails所構(gòu)建的應(yīng)用程序基本目錄結(jié)構(gòu)總結(jié)2016-05-05Ruby的字符串與數(shù)組求最大值的相關(guān)問題討論
這篇文章主要介紹了Ruby中的字符串與數(shù)組求最大值的相關(guān)問題,文中還提到了sort排序方法的相關(guān)用法,需要的朋友可以參考下2016-03-03Ruby on Rails在Ping ++ 平臺實(shí)現(xiàn)支付
本文給大家分享的是使用Ruby on Rails在Ping ++ 平臺實(shí)現(xiàn)支付功能的代碼,非常的實(shí)用,有需要的小伙伴可以參考下。2016-02-02