Ruby語言的知識(shí)點(diǎn)很多,不過對(duì)于Rails 開發(fā)者來說需要掌握的很少妒蔚。本文主要內(nèi)容來自于《ruby on rails tutoril》這本書,是對(duì)這本書學(xué)習(xí)后第四章的個(gè)人總結(jié),內(nèi)心非常感謝該書作者M(jìn)ichael Hartl,也非常感謝中文翻譯安道老師??
字符串和方法
Rails控制臺(tái):Rails控制臺(tái)是用來與Rails應(yīng)用交互的命令行工具青抛,它基于Ruby的交互程序(irb)開發(fā),可以使用ruby語言的所有功能酬核,本文的操作都是在Rails控制臺(tái)中完成的蜜另。
字符串
對(duì)于web應(yīng)用适室,字符串或許是最重要的數(shù)據(jù)結(jié)構(gòu),因?yàn)榫W(wǎng)頁的內(nèi)容就是從服務(wù)器發(fā)送給瀏覽器的字符串蚕钦。(書中原話)
如圖-1亭病,使用雙引號(hào)("")創(chuàng)建字符串鹅很;使用 + 拼接字符串嘶居;使用特殊句法 #{} 進(jìn)行插值操作。
Ruby 也支持單引號(hào)創(chuàng)建字符串促煮,大多數(shù)情況下這兩種字符串效果是一樣的邮屁,二者最重要的區(qū)別是:Ruby 不會(huì)對(duì)單引號(hào)字符串進(jìn)行插值操作。
注釋:Ruby中的注釋以井號(hào) # 開始菠齿,一直到行尾佑吝。
對(duì)象和消息傳送
在Ruby中,一切皆對(duì)象绳匀,對(duì)象的作用:響應(yīng)消息芋忿。一般來說,傳給對(duì)象的消息是“方法”疾棵,也就是在這個(gè)對(duì)象上定義的函數(shù)戈钢。
>> "GongYangbo".length? ? ? ? ? ? #字符串響應(yīng)length方法,返回字符串中包含的字符數(shù)量
=> 10
empty? 方法后面的?是ruby的約定 是尔,說明返回的是布爾值殉了;
布爾值可以和? ? &&(與)? ? ||(或)? ? !(非)? 運(yùn)算符結(jié)合到一起使用拟枚;
>>? nil.to_s? ? ? ? #一切皆對(duì)象薪铜,nil也是對(duì)象,響應(yīng)to_s方法
=>? ""
>> puts "It's a palindrome!" if s == s.reverse ? ? ? #簡單的回文測試
數(shù)組和值域
數(shù)組是一組具有特定順序的元素恩溅。Ruby中可以包含不同類型的數(shù)據(jù)隔箍。
split 方法
>>? "gong yang bo".split? ? ? ? #把字符串拆分成有三個(gè)元素的數(shù)組
=>? ["gong", "yang", "bo"]
默認(rèn)情況下,split在空格處把字符串拆分成數(shù)組脚乡,不過也可以在幾乎任何地方拆分:
>> "fooxbarxbazx".split('x')
=> ["foo", "bar", "baz"]
數(shù)組可以響應(yīng)一系列方法:
>> a
=> [42, 8, 17]
>> a.length? ? ? ? ? ? #數(shù)組中元素個(gè)數(shù)
=> 3
>> a.empty?? ? ? ? ? #數(shù)組是否為空
=> false
>> a.include?(42)#數(shù)組元素中是否包含42
=> true
>> a.sort? ? ? ? ? ? ? ? #排序
=> [8, 17, 42]
>> a.reverse? ? ? ? ? #元素對(duì)掉
=> [17, 8, 42]
>> a.shuffle? ? ? ? ? #打亂元素順序蜒滩,隨機(jī)變化
=> [17, 42, 8]
>> a
=> [42, 8, 17]
上面的方法都沒有修改 a 的值。如果要修改數(shù)組的值每窖,要使用相應(yīng)的“炸彈”(bang)方法(之所以這么叫是因?yàn)榘锏簦@里的感嘆號(hào)經(jīng)常都讀作“bang”):
>> a
=> [42, 8, 17]
>> a.sort!
=> [8, 17, 42]
>> a
=> [8, 17, 42]
使用push方法向數(shù)組中添加元素,或者使用等價(jià)的<<運(yùn)算符:
>> a.push(6)? ? ? ? ? ? ? ? ? # 把 6 加到數(shù)組末尾
=> [42, 8, 17, 6]
>> a << 7? ? ? ? ? ? ? ? ? ? # 把 7 加到數(shù)組末尾
=> [42, 8, 17, 6, 7]
>> a << "foo" << "bar"? ? ? ? # 串聯(lián)操作
=> [42, 8, 17, 6, 7, "foo", "bar"]
join 方法:split方法可以把字符串拆分成數(shù)組窒典,使用join方法可以把數(shù)組轉(zhuǎn)化成字符串(相反的操作)(圖-2)
值域(range)
Range是范圍對(duì)象的類蟆炊,定義的時(shí)候可以使用范圍操作符“..”或者“...”,“..”生成的范圍對(duì)象包括起點(diǎn)和終點(diǎn)瀑志,“...”生成的范圍對(duì)象不包括起點(diǎn)和終點(diǎn)涩搓,范圍是由是一序列有順序污秆、有規(guī)律的元素對(duì)象組成,任何有順序昧甘,有規(guī)律的一組對(duì)象良拼,都可以用Range對(duì)象來定義,如數(shù)字充边、字母庸推、字符串、甚至?xí)r間浇冰。
#遍歷2017-01-01至2017-02-28每一天贬媒,對(duì)象是Date
begin_date = Date.parse '2017-01-01'
end_date = Date.parse '2017-02-28'
r1=begin_date .. end_date
r1.each{|date| puts date}
塊(block)
數(shù)組和值域可以響應(yīng)的方法中有很多都可以跟著一個(gè)塊(block)
>> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5
這段代碼在值域(1..5)上調(diào)用each方法,然后又把{ |i| puts 2 * i }這個(gè)塊傳給each方法肘习。|i|兩邊的豎線在 Ruby 中用來定義塊變量际乘。只有方法本身才知道如何處理后面跟著的塊。這里漂佩,值域的each方法會(huì)處理后面的塊脖含,塊中有一個(gè)局部變量i,each會(huì)把值域中的各個(gè)值傳進(jìn)塊中投蝉,然后執(zhí)行其中的代碼养葵。
花括號(hào)是表示塊的一種方式,除此之外還有另一種方式:
>> (1..5).each do |i|
>> ? ? puts 2 * i
>> end
2
4
6
8
10
=> 1..5
inject 方法
arr1 = []
arr2 = [1,2,3]
arr2.each do |i|
? ? arr1 << i + 1
end
p arr1
#=> [2, 3, 4]
使用inject:
arr = arr2.inject ([]) do |arr1, i|
? ? arr1 << i + 1
end
p arr
#=>[2,3,4]
map 方法
>> (1..5).map { |i| i**2 }? ? ? ? ? # ** 表示冪運(yùn)算
=> [1, 4, 9, 16, 25]
>> %w[a b c]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # %w 用于創(chuàng)建元素為字符串的數(shù)組
=> ["a", "b", "c"]
>> %w[a b c].map { |char| char.upcase }
=> ["A", "B", "C"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
map方法返回的是在數(shù)組或值域中每個(gè)元素上執(zhí)行塊中代碼后得到的結(jié)果墓拜。
map后面的塊在塊變量上調(diào)用一個(gè)方法港柜,這種操作經(jīng)常使用簡寫形式:
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase)
=> ["a", "b", "c"]
生成隨機(jī)8個(gè)字母組合:
>> ('a'..'z').to_a? ? ? ? ? ? ? ? ? ? # 由全部英文字母組成的數(shù)組
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
>> ('a'..'z').to_a.shuffle? ? ? ? ? ? # 打亂數(shù)組
=> ["c", "g", "l", "k", "h", "z", "s", "i", "n", "d", "y", "u", "t", "j", "q",
"b", "r", "o", "f", "e", "w", "v", "m", "a", "x", "p"]
>> ('a'..'z').to_a.shuffle[0..7]? ? ? # 取出前 8 個(gè)元素
=> ["f", "w", "i", "a", "h", "p", "c", "x"]
>> ('a'..'z').to_a.shuffle[0..7].join? # 把取出的元素合并成字符串
=> "mznpybuj"