ruby 學習筆記(2) 類的基本使用

來源:互聯網
上載者:User

ruby語言跟c#的一些重要差別在於:
1.ruby是動態語言,c#是靜態語言--即對象在new出來以後,ruby還可以動態給對象執行個體添加一些屬性或方法(javascript也是如此)
2.ruby中刻意弱化了變數類型這個概念,預設情況下變數/方法都不需要聲明具體(返回)類型,但其實在ruby內部,會自動根據變數的值配置類型。(可以通過 “puts 變數.class“查看)
3.ruby相對c#來講,可能有些雷的地方在於:父類中的private成員,居然是可以在子類中使用的!
...其它地方,等學習深入了再寫出來
最後上一段測試代碼,展示了ruby中類的基本用法: 複製代碼 代碼如下:class People #跟javascript這類動態語言一樣,ruby中的類也沒有public,private這類存取控制標識符

def initialize(_name) #建構函式,名字是固定:initialize
@name = _name; #約定:類的私人變數以@開頭
end

def to_string #類似C#中的做法,這裡寫一個ToString方法的ruby版
"My name is #{@name}" #ruby中方法最後一行的值,會被當作函數值返回
end

def get_name_size
return @name.length #這個方法中返回的是數字型(即名稱的長度)
end

def test #類定義的最後部分,把這個方法標記為私人方法了
puts "private method(test) in People."
end

def show_name
test #私人方法,可在內部調用
puts "name = #{@name}"
end

attr_accessor:name #定義一個可讀寫的屬性,這裡也體現了ruby的一個重要思想:約定重於規範,因為@name在之前已經使用過,這裡的屬性只需要把@去掉,ruby就會自動智能的產生類似c#中 set{value = @name},get{return @name}的語句

private:test #標明test方法是private屬性的
protected:get_name_size #標明get_name_size只能在本類或子類定義中使用(或者在子類定義中賦值給子類執行個體)

end
aPeople = People.new("jimmy");#建立一個People的執行個體
puts aPeople.to_string #調用to_string方法
#puts aPeople.get_name_size #將報錯,因為該方法受保護
#puts aPeople.test #將報錯,因為該方法是私人方法
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 #調用父類的受保護方法
end

def call_protected_method2(man1)
puts man1.get_name_size #注意這裡:這裡可以把父類的受保護方法,動態添加到子類執行個體
end

def call_private_method #子類可以調用父類的私人方法!!! 這一點剛開始很不習慣
test
end

def call_private_method2(man1)
man1.test #注意這裡:語法檢查雖然可以通過,但是運行時會提示私人方法無法調用,這也是private與protected的區別
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本身對變數沒有類型概念,但是這樣卻不行,即:在調用父類的受保護方法時,其實是要類型匹配的
puts aMan.class #顯示aMan的類名稱

運行結果如下: 複製代碼 代碼如下:>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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.