Ruby 型別和方法

2021-09-03 09:01:09 字數 4563 閱讀 2460

1. 標準型別

1.1 數字

ruby支援整數和浮點數。整數可以是任何長度,一定範圍內的整數在內部以二進位制形式儲存,它們是fixnum類的物件,範圍之外的整數儲存在bugnum類的物件中。ruby會自動管理它們之間的來回轉換。

在書寫整數時,可以使用乙個可選的前導符號,可選的進製指示符(0b表示二進位制,0表示八進位制,0d表示十進位制,0x表示十六進製制),後面跟一趾符合適當進製的數字,下劃線在數字串中被忽略。

帶有小數點或冪的的數字字面量被轉換成浮點物件,必須在小數點之前和之後都給出數字,比如"1.0e3"寫成"1.e3",ruby會試圖呼叫fixnum類的e3方法。

整數也支援幾種迭代器,比如times表示次數,例如:

6.times
還有upto和downto,它們在兩個整數之間分別向上和向下迭代,例如:

1.upto(10) 

10.downto(1)

numeric類提供了更通用的step方法,例如:

1.step(100, 10)

1.2 字串

ruby字串是8位元位元組的序列,通常它們包含可列印字元,但這不是乙個必要條件,字串也可以包含二進位制資料,字串是string類的物件。

可以在字串字面量中放置各種轉義序列,例如"\n",表示乙個回車換行符。除此之外,可以使用"#{}"序列把任何ruby**的值放進字串中,如果**只是全域性變數、類變數或例項變數,花括號可以忽略。

另外還有3種方式去構建字串字面量。"%q"和"%q"分別開始界定單引號和雙引號的字串,例如:

%q/hello world!/

%q/hello #/

跟在q或q後面的字元是分界符,字串被一直讀取直到發現相匹配的結束符號,否則,字串會被一直讀取,直到出現下乙個相同的分界符。

最後,可以使用"here document"構建字串,例如:

string = <"here document"由原始檔中的那些行但沒有包含在"<<"字元後面指明終結字串的行組成,如果把乙個減號放在"<<"字元後面,就可以縮排編排終結符,例如:

string = <<-end_of_string

hello world!

hello john!

end_of_string

ruby有75個以上的標準方法,比如string#chmop方法可以去除首尾空格,例如:

puts "hello world!\r\n".chomp
string#split方法可以根據正規表示式分割字串,例如:

stringlist = 'hello john!'.split(/ /)

puts stringlist[1]

string#squeeze方法可以刪除重複字元,例如:

puts 'hello world!!!'.squeeze('!')
string#scan方法從字串中抽取匹配正規表示式的元素,例如:

puts 'hello world!'.scan(/e.*l/)

1.3 區間

區間的第乙個且可能最自然的用法是表達序列,在ruby中使用".."和"..."區間操作符來建立序列。兩個點的形式是建立閉合的區間,而3個點的形式是建立半閉半並的區間(不包括右端的值)。可以使用to_a方法把區間轉換成陣列,例如:

(1..10).to_a

('bar'..'bat').to_a

區間實現了許多方法可以迭代它們,並且以多種方式測試它們的內容,例如:

digits = 0..9

digits.include?(5)

digits.min

digits.max

digits.reject 

digits.each

ruby可以根據自己所定義的物件來建立區間,唯一的限制是這些物件必須返回在序列中的下乙個物件作為對succ的響應,而且這些物件必須是可以使用"<=>"來比較的,"<=>"操作符比較兩個值,並根據第乙個值是否小於、等於或大於第二個值,分別返回-1,0或+1,例如:

class test

include comparable

attr :value

def initialize(value)

@value = value

enddef <=>(other)

self.value <=> other.value

enddef succ

test.new(@value.succ)

endendmyvalue = test.new(1)..test.new(9)

myvalue.to_a

myvalue.include?(test.new(2))

區間可以當作條件表示式來使用,當區間第一部分的條件為true時,它們就開啟,當區間第二部分的條件為true時,它們就關閉,例如:

while line = gets

puts line if line =~ /start/ .. line =~ /end/

end

區間還有一種用法是間隔測試,看一些值是否會落入區間表達的間隔內,使用"==="操作符即可,例如:

(1..10) === 5

1.4 正規表示式

正規表示式被用來根據模式對字串進行匹配。ruby提供了內建的支援,使得匹配和替換更方便和更簡明。正規表示式是regexp型別的物件,可以通過顯示呼叫建構函式或使用字面量形式"/pattern/"和"%r"來建立它們,例如:

regexp.new('^[a-z]+')

/^[a-z]+/

%r

有了正規表示式物件,可以使用regexp#match或匹配操作符"=~"和"!~"對字串進行匹配。匹配操作符對string和regexp物件均有定義,例如:

name = 'john'

name =~ /o/

/a/ =~ name

匹配操作符返回匹配發生的字元位置,它們會設定一些ruby變數。"$&"得到與模式匹配的那部分字串,"$`"得到匹配之前的那部分字串,而"$'"得到匹配之後的那部分字串。

每個正規表示式包含一種模式,用來對字串進行正規表示式的匹配。在特殊字元之前放置乙個反斜線便可以匹配它們的字面量。

2. 方法

2.1 定義方法

可以使用關鍵字def來定義乙個方法。方法名必須以乙個小寫字母開頭。表示查詢的方法名通常以"?"結尾,例如instance_of?。會修改接收者物件的方法,可以用"!"結尾,例如chop和chop!,第乙個方法返回乙個修改後的字串,而第二個則就地修改物件。可以被賦值的方法以乙個等號"="結尾。

方法可能還需要宣告某些引數,它們就是括號中列出的區域性變數。方法引數兩邊的括號是可選的,例如:

def method1(arg1, arg2, arg3)

enddef method2

end

ruby可以指定方法引數的預設值,例如:

def method(arg='john')

end

如果希望傳入可變個數的引數或者用乙個形參接收多個引數,在引數名前放置乙個星號"*"即可,例如:

def method(*arg) 

end

當呼叫乙個方法時,可以用乙個block與之相關聯,通常可以使用yield從方法內部呼叫這個block。但是如果方法定義的最後乙個引數字首為"&",那麼所關聯的block會被轉換為乙個proc物件,然後賦值給這個引數,例如:

def method(&block)  

block.call()

endmethod()

2.2 呼叫方法

可以通過指定接收者、方法的名稱、可選的引數及block,來呼叫乙個方法。對類方法或模組方法來說,接收者是類或模組的名字。如果省略了接收者,其預設是self。 每個被呼叫的方法都會返回乙個值。ruby有乙個return語句,可以從當前執行的方法中退出,如果不需要return,則返回的是方法執行中最後乙個語句執行的結果。

在方法定義中,如果在乙個正規引數前加上星號,那麼傳入這個方法呼叫的多個引數將會被裝入乙個陣列。如果要分解乙個陣列,則在陣列引數前加乙個星號"*",例如:

def method(args1, args2, args3)

puts "# # #"

endmethod(1, 2, 3)

method(1, *[2, 3])

Ruby混合型別

當乙個類擁有可以從多個父類繼承的特點,類應該顯示多重繼承。ruby沒有直接支援多繼承,但ruby模組有另乙個精彩使用。他們幾乎消除多重繼承的需要,提供了乙個工廠,稱為混入。混合型別給乙個精彩的控制方式增加功能類。在 中混合類,使用它的 能進行互動。module a def a1 enddef a2 ...

ruby 資料型別

整型分兩種,如果在31位以內 四位元組 那為fixnum例項。如果超過,即為bignum例項。整數範圍從 230 到 230 1 或 262 到 262 1。在這個範圍內的整數是類 fixnum 的物件,在這個範圍外的整數儲存在類 bignum 的物件中。您可以在整數前使用乙個可選的前導符號,乙個可...

Ruby資料型別

foreverphoenix的專欄 數字1 ruby支援整數和浮點數。整數可以使任何長度。一定範圍內的整數是fixnum類的物件。範圍之外的整數儲存在bignum類的物件中。這種處理是透明的。2 可以在乙個ascii字元前加乙個問號來獲得其對應的整數值。ctrl組合鍵可以由?c x或?cx x 0x...