標籤:style blog http io os ar 使用 sp 2014
在Ruby中,通過調用建構函式(constructor)來建立對象
song1=Song.new("Ruby")
- Ruby對單引號串處理的很少,除了極少的一些例外,鍵入到字串字面量的內容就構成了這個字串的值。
Ruby對雙引號字串遊更多地處理。首先,它尋找以反斜線開始的序列,並用二進位值替換它們。其次是字串內的運算式插入,#{運算式}序列會被“運算式”的值替換。
- $greeting="Hello" # $greeting是全域變數
- @name="Prodence" # @name是執行個體變數
- Ruby 使用一種命名慣例來區分名稱的用途:名稱的第一個字元顯示這個名稱如何被使用。局部變數、方法參數和方法名稱都必須以小寫字母或底線開始。全域變數都有$為首碼,執行個體變數以@符號開始,類變數以@@符號開始。類名稱、模組名稱和常量必須以一個大寫字母開始。
- 許多語言中nil(或null)的概念是指“沒有對象”, 在Ruby中,這是不一樣的:nil是一個對象,與別的對象一樣,只不過它是用來表示沒有任何東西的對象。
- a = %w{ant bee cat dog} 等價於下面的表達方式
- a= [‘ant‘,‘bee‘, ‘cat‘ ,‘dog‘]
- Regex只是一種指定字元模式的方法,這個字元模式會在字串中進行匹配。在Ruby中,通常在斜線之間(/pattern/)編寫入模式來建立Regex。
- Block:
def call_block
puts "Start of method"
yield
yield
puts "End of method"
end
call_block {puts "In the block"}
Result:
Start of method
In the block
In the block
End of method
使用block來實現迭代器:迭代器是從某種收集如數組中連續返回元素的方法
animals= %w(ant bee cat dog elk)
animals.each{|animal| puts animal}
Result:
ant
bee
cat
dog
elk
class Song
def initialize(name, artist, duration)
@name=name
@artist=artist
@duration=duration
end
end
song=Song.new("Bicyclops","Fleck",260)
puts song.inspect
Result:
#<Song:0x00000002eca6d8 @name="Bicyclops", @artist="Fleck", @duration=260>
inspect方法(可以發送給任何對象)預設將對象的ID和執行個體變數格式化。
- 一個對象的外部可見部分被稱為其屬性(attribute)
class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist,duration)
@lyrics=lyrics
end
def to_s
"KS: #{@name}--#{@artist} (#{@duration}) {#{@lyrics}}"
end
attr_reader :name, :artist, :duration, :lyrics # Attributs setting method 2
def name #Attribute setting method 1
@name
end
def artist
@artist
end
end
song=KaraokeSong.new("Bicyclops","Fleck",260,"And now,the...")
puts song.artist
- 當調用super而不使用參數時, Ruby向當前對象的父類發送一個訊息,要求它調用子類中的同名方法
- Object的執行個體方法
- 可寫的屬性:
方法一: 建立一個名字以等號結尾的方法
方法二:attr_writer
上面的樣本中使用屬性方法建立了一個虛擬執行個體變數。對外部世界來說,duration_in_minutes就像其他屬性一樣。然而,在內部它沒有相應的執行個體變數。
屬性就是一個方法。某些時候,屬性簡單地返回執行個體變數的值。某些時候,屬性返回計算後的結果。並且某些時候,那些名字已等號結尾的方法,被用來更新對象的狀態。
當設計一個類的時候,決定其具有什麼樣的內部狀態,並決定這內部狀態對外界的表現形式。內部狀態儲存在執行個體變數中。通過方法暴露出來的外部狀態,我們稱之為屬性。類可以執行的其他動作,就是一般方法。
- 類變數:類變數以兩個@符開頭,與全域變數和執行個體變數不同,類變數在使用之前必須被初始化,通常,初始化就是在類定義中的簡單賦值
new方法建立一個新的類對象,但是new方法本身並不與一個特定的對象相關聯。
類方法和執行個體方法是通過它們的定義區別開來的: 通過在方法名之前放置類名以及一個句點,來定義類方法
- Public(公有)方法可以被任何人調用,沒有限制存取控制。方法預設是public的(initialize除外,它是private的)
- Protected(保護)方法只能被定義了該方法的類或其子類的對象所調用。整個家族均可訪問
- Private(私人)方法不能被明確的接收者調用,其接收者只能是self。這意味著稀有方法只能在當前對象的上下文中被調用;你不能調用另一個對象的私人方法
另外,可用通過將方法名作為參數列表傳入存取控制函數來設定它們的存取層級
變數是一個對象嗎?在Ruby中,答案是‘不’。變數只是對象的引用。對象漂浮在某處一個很大的池中(大多數時候是堆,即heap中),並由變數指向它們
可以通過使用String的dup方法來避免建立別名,它會建立一個新的、具有相同內容的String對象
可以通過凍結一個對象來阻止其他人對其進行改動。試圖更改一個被凍結的對象,Ruby將引發一個TypeError異常
- 容器(Continuers):是指含有一個或多個對象引用的對象
數組類含有一組對象引用。每個對象引用佔據數組中的一個位置,並由一個非負的整數索引來標識
數組有[]操作符來進行索引。和Ruby的大多數操作符一樣,它實際上是一個方法(Array類的一個執行個體方法),因此可以被子類重載。使用非負整數訪問數組,將會返回處於該整數位置上的對象,如果此位置上沒有對象,則返回nil。使用負整數訪問數組,則從數組末端開始計數
可以使用一對數字[start, count]來訪問數組,這將返回一個包含從start還是的count個對象引用的新數組
還可以使用range來對數組進行索引,其開始和結束位置被兩個或3個點分隔開。兩個點的形式包含結束位置,而3個點的形式不包含
[]操作符有一個相應的[]=操作符,他可以設定數組中的元素。如果下標是單個整數,那麼其位置上的元素將被指派陳述式右邊的東西所替換。造成的任何間隙由nil來填充
也成關聯陣列、圖、詞典。Hash可以用任何類型的對象來進行索引,比如字串、Regex等等。當你將一個值存入Hash時,需要提供兩個對象,一個是索引(通常稱為鍵(key)),另一個是值。
首先, block在代碼中只和方法調用一起出現;block和方法調用的最後一個參數處於同一行,並緊跟在其後(或者參數列表的右括弧的後面)
其次, 在遇到block的時候,並不立即執行其中的代碼。Ruby會記住block出現時的上下文(局部變數、當前對象等),然後執行方法調用
在block定義中,參數列表位於兩個豎線(管道符)之間, block可以有人以數量的參數
返回低於某個值的所有Fibonacci數列項:
如果傳遞給block的參數是已經存在的局部變數,那麼這些變數即為block的參數,它們的值可能會因block的執行而改變。同樣的規則適用於block內的變數:如果它們第一次出現在block內,那麼它們就是block的局部變數。相反,如果它們先出現在block外,那麼block就與其外部環境共用這些變數
Defined? 方法在其參數沒有定義時返回nil
inject迭代器:讓你可以遍曆收集的所有成員以累計出一個值
inject是這樣工作的:block第一次被執行時,sum被置為inject的參數,而element被置為收集的第一個元素。接下來每次執行block時,sum被置為上次block被調用時的傳回值。inject的最後一次調用block返回的值。如果inject沒有參數,那麼它使用收集的第一個元素作為初始值,並從第二個元素開始迭代。
一定範圍內的整數
在內部以二進位形式儲存,它們是Fixnum類的對象,範圍之外的整數儲存在Bignum類的對象
Ruby 會自動管理它們之間的來迴轉換。
在書寫整數時,可以使用一個可選的前置字元號,可選的進位指示符(0表示八進位,0d表示十進位[預設], 0x表示十六進位或者0b表示二進位),後面跟一串符合適當進位的數字。底線在數字串中被忽視。
所有整數都是對象,並且可以對各種形式的訊息作出響應。Ruby使用num.abs而不是abs(num)去得到數位絕對值
整數支援的幾種有用的迭代器:
注意downcase方法名稱結尾處的驚嘆號, 這個標識用來表示方法會在適當的位置修改接收者,在這個例子中,它把字串變成小寫
1. 區間的第一個且最可能最自然的用法是:表達序列。在Ruby中,使用“..”和“...”區間操作符來建立序列。兩個點的形式是建立閉合的區間(包括右端的值),而3個點的形式是建立半閉半開的區間,不包括右端的值
<=>太空船操作符,它比較兩個值,並根據第一個值是否小於、等於、大於第二個值,分別返回-1,0,+1
2. 區間作為條件:在這裡它們表現的就像某種雙向開關 - 當區間第一部分的條件為為true時,它們就開啟,當期間第二部分的條件為true時,它們就關閉。例如下面的程式碼片段,列印從標準輸入得到的行的集合,每組的第一行包含start這個詞,最後一行包含end這個詞
3. 區間作為間隔: 看看一些值是否會落入區間表達的間隔內。使用===(case equality操作符)可以做到這一點
Programming Ruby 閱讀筆記