Ruby是完全物件導向的。
Ruby的注釋以“#”開頭。
Ruby在調用無參數方法的時候,通常省略括弧;而且Ruby只能通過方法訪問對象的內部狀態。
代碼塊和迭代器
1) times和upto是整數對象實現的方法,是一種被稱為“迭代器(iterator)”的方法,類似於迴圈。“{}”中包含的代碼成為代碼塊(block)。
3.times {print "Ruby! "}1.upto(9) {|n| print n}
2) 數組(以及類似的“可枚舉的”對象)具有名為each的迭代器,它為每個元素調用一次相關聯的代碼塊;每次對代碼塊的調用都以該元素作為參數。
a = [1, 2, 3]a.each do |n| print n ** 2end
3)其他迭代器
- map 用於遍曆數組中的元素,執行代碼塊中的操作,並將代碼塊的傳回值置於map所返回的新數組中。
- select 用於遍曆數組中的元素,執行代碼塊中的操作,如果返回判斷為true,則將該元素置於select所返回的新數組中。
a = [1, 2, 3, 4]b = a.map {|n| n ** 2}# b = [1, 4, 9, 16]c = a.map {|n| print n}# c = [nil, nil, nil, nil]d = a.select {|n| n % 2 == 0}# d = [2, 4]e = a.select {"k"}# e = [1, 2, 3, 4]f = a.select {|n| print n}# f = []
inject也都是
4) 雜湊(hash)也是Ruby的基礎資料結構。與數組類似,以“[]”來存取元素值,不過hash是以鍵對象來作為索引。Hash類也定義了each迭代方法,此方法為每個索引值對調用一次代碼塊,並將鍵和值作為參數傳入代碼塊。
Hash可以使用任何對象作為鍵,但是Symbol對象是最常用的。
k = "key 01" h = { :one => 1, :two => 2, k => "Value 01"} h[:one] = "ONE"p "h[k]=> '#{h[k]}'" h.each do |k, v| p "#{k}: #{v}" end
字串插入:雙引號中可以包含任何ruby運算式,但這些運算式必須包含在分界符#{和}裡。運算式的值通過to_s方法,轉化為字串代替原運算式。
p "#{true}"# 列印出"true"p "#{false}"# 列印出"false"p "#{nil}"# 列印出""
運算式和操作符
1)Ruby的文法是面向運算式的,諸如if類的控制結構其實也是運算式,也是具有值的。就很像三目運算子。
m = if 2 > 1 then "y" else "n" end
2)雖然Ruby所有語句都是運算式,但是並不是所有的語句都會返回有意義的值。比如while迴圈和方法定義通常都只返回nil。
3)許多Ruby操作符都是作為方法來實現的,而且類可以從定義它們。但是不能定義全新的操作符,因為可識別的操作符是一個固定的集合。
"Ruby! " * 3# "Ruby! Ruby! Ruby! ""Hello, %s! -- %d" % ["Ruby", 2011]# "Hello, Ruby! -- 2011"[1,2,3] << 5# [1, 2, 3, 5]"Hello, " << "Wolrd!"# "Hello, Wolrd!"
4)[]是可以被重寫的最為強大的操作符之一。Array類的[]操作符就可以接受兩個參數,用來擷取數組的子數組或者片段。
方法
1)def定義,返回最後一個運算式的值
def cube(x) x ** 3end
2)如果定義在類或模組之外,則是一個全域函數,而不是一個方法。全域函數實際可以認為是Object類的私人方法。
3)可以為類或對象專門定義方法,只要以類名或對象名為首碼即可。
a = "Solana"def a.say() p "I'm Solana!"enda.say
賦值
1) 並行賦值
x, y, z = 1, 3, 5# x=1; y=3; z=5x, y = y, x# 交換值a, b, c = [2, 4, 6]# a=2; b=4; c=6
2)方法可以有多個傳回值,並行賦值很方便
def calc(x) [x**2, x**3]enda, b = calc(7)p a, b
3) 以等號結尾的方法,Ruby允許以賦值操作的文法來調用它們。
o.x=(1)o.x = 1
首碼尾碼標點符號
1)尾碼
尾碼?的方法,表示謂詞,返回Boolean值;比如Array的empty?方法。
不帶!的方法,返回調用該方法的對象的一個修改過的拷貝;尾碼!的方法,則是一個可變方法,可以修改原對象。比如Array的sort和sort!方法。
a = []b = [4,7,2,3,9,1]c = bp a.empty?b.sortp bb.sort!p c
2)首碼$ 全域變數
@ 執行個體變數
@@ 類變數
RegExp和Range都有字面量,都定義了==操作符來進行相等性測試,也都定義了===操作符來進行匹配性和從屬性測試。
x = 3p case x when 0...3: "0 <= x < 3" when 3...6: "3 <= x < 6" when 6..9: "6 <= x <= 9" else "others"endusrname = "Gengv2007"p case usrname when /^[a-z]/ "Started with lowercase letter." when /^[A-Z]/ "Started with uppercase letter." when /\d$/ "Started with number."end
Ruby的case語句看起來是“非直落”的。
類是一些相關方法的集合,這些方法操作一個對象的狀態,一個對象的狀態被儲存在它的執行個體變數中(@開頭的變數)。
Ruby的字串是可變的,[]=操作符可以改變字串中的字元,或者插入、刪除、替換子字串;<<操作符可以再字串後面追加內容。
字串是可變的,所以再迴圈中包含一個字串字面量,每次迴圈都會為它建立新的對象。通過在字串(或其他任何對象)上調用freeze方法,可以防止對該對象的任何改變。
條件和迴圈(如if、while)的判斷運算式不一定非得是true或false;nil被當成false來處理,其他任何值(比如0或者"")都被當成true。