類
Ruby中一切都是對象,包括一個常數.
比如可以用.class屬性來查看一個對象的類型,你可以看下1.class,會發現常數1的類型是Fixnum,1不過是Fixnum的一個實例。
Ruby中的類以class開始 以end結束,類名首字母的約定是大寫。
Ruby中的方法以def開始 以end結束,方法名首字母的約定是小寫。
Ruby中的局部變量名首字母的約定是小寫。
Ruby中的構造函數名稱為initialize。
Ruby中的成員變量(實例變量)前導@符,在initialize裡進行聲明與初始化。
Ruby中的屬性用attr, attr_reader, attr_writer, attr_accessor。
Ruby中的全局變量前導$符。
Ruby中的常數(常量)用大寫字母開頭,約定是全部大寫。
initalize方法
當Ruby創建一個新對象時,它總是會尋找一個名為 initialize 的方法並執行它.因此,我們可以簡單通過一個initialize方法向實變量中加入缺省值。
class Person
def initialize()
puts "hello!"
end
# def initialize #()省略一樣
# puts "hello!"
# end
#參數默認值
# def initialize (param = "1900lab") # 參數帶有默認值
# puts "hello! " + param
# end
#可變長參數
def youInput(*names)
puts "input #{names.join(",")}!"
end
end
p = Person.new()
和 p = Person.new 一樣,沒有參數()可以省略。
屬性
目的是快速生成讀寫方法
attr :attr1, key
attr_reader :attr1, :attr2
attr_writer :attr1, :attr2
attr_accessor :attr1, :attr2
attr 一般後跟一個符號參數, 第二個參數是一個 bool 參數,用於指示是否為符號參數產生寫方法。它的默認值是 false,只產生讀方法,不產生寫方法。
attr_reader 一般後跟一個符號參數,定義一個或多個只讀的屬性,用於指示為符號參數產生讀方法。
attr_writer 一般後跟一個符號參數,定義一個或多個只寫的屬性,用於指示為符號參數產生寫方法。
attr_accessor 一般後跟一個符號參數,定義一個或多個可讀寫的屬性,用於指示為符號參數產生讀寫方法。
為什麼要用 符號
我們可能會有疑問,為什麼 attr 後面要用符號呢(冒號:+ 變量)?
其實我們不用符號也可以的
class Person
attr "name",true
end
p = Person.new()
p.name = "xiao ming"
puts p.name
我們需要知道
符號是不可改變的字符串,也不可被GC的
在大多數情況下,接受符號作為參數的方法也能接受字符串,反過來不成立;
每個符號在對象空間中只出現一次,用符號要比用字符串省內存
為什麼Ruby runtime可以保證每一個symbol唯一?
這是因為Ruby把symbol存放在運行時維護的一個符號表裡了,而這個符號表實際上是一個atom數據結構,其中存儲著當前所有的程序級的name,確保不出現內容相同的多個對象。幾乎每一個語言和系統都會有這樣一個符號表,只不過象C/C++那樣的語言,這個符號表只是在編譯時存在,運行時就沒了。而Python、Ruby則在運行時也保留這張表備用。
為什麼用符號
只所以用符號不用字符串,我想主要是內存和效率這兩個方面吧。
Ruby中兩個內容相同的字符串文本量實際上是兩個不同的對象。
a = "hello"
b = "hello"
雖然倆字符串內容都一樣,但是你比一下a和b,就知道a.object_id != b.object_id,它們指向的不是同一個對象。
如果用字符串的話,p.name = "xiaoming" 和 p.name = "小紅" 就可能占用2倍的內存。
效率方面可能就是為了避免多次動態生成字符串吧。