Ruby語(yǔ)言的知識(shí)點(diǎn)很多,不過(guò)對(duì)于Rails 開(kāi)發(fā)者來(lái)說(shuō)需要掌握的很少。本文主要內(nèi)容來(lái)自于《ruby on rails tutoril》這本書(shū),是對(duì)這本書(shū)學(xué)習(xí)后第四章的個(gè)人總結(jié),內(nèi)心非常感謝該書(shū)作者M(jìn)ichael Hartl,也非常感謝中文翻譯安道老師??
字符串和方法
Rails控制臺(tái):Rails控制臺(tái)是用來(lái)與Rails應(yīng)用交互的命令行工具,它基于Ruby的交互程序(irb)開(kāi)發(fā),可以使用ruby語(yǔ)言的所有功能,本文的操作都是在Rails控制臺(tái)中完成的。
字符串
對(duì)于web應(yīng)用,字符串或許是最重要的數(shù)據(jù)結(jié)構(gòu),因?yàn)榫W(wǎng)頁(yè)的內(nèi)容就是從服務(wù)器發(fā)送給瀏覽器的字符串。(書(shū)中原話)
如圖-1,使用雙引號(hào)("")創(chuàng)建字符串;使用 + 拼接字符串;使用特殊句法 #{} 進(jìn)行插值操作。

Ruby 也支持單引號(hào)創(chuàng)建字符串,大多數(shù)情況下這兩種字符串效果是一樣的,二者最重要的區(qū)別是:Ruby 不會(huì)對(duì)單引號(hào)字符串進(jìn)行插值操作。
注釋?zhuān)篟uby中的注釋以井號(hào) # 開(kāi)始,一直到行尾。
對(duì)象和消息傳送
在Ruby中,一切皆對(duì)象,對(duì)象的作用:響應(yīng)消息。一般來(lái)說(shuō),傳給對(duì)象的消息是“方法”,也就是在這個(gè)對(duì)象上定義的函數(shù)。
>> "GongYangbo".length? ? ? ? ? ? #字符串響應(yīng)length方法,返回字符串中包含的字符數(shù)量
=> 10
empty? 方法后面的?是ruby的約定 ,說(shuō)明返回的是布爾值;
布爾值可以和? ? &&(與)? ? ||(或)? ? ?。ǚ牵? 運(yùn)算符結(jié)合到一起使用;
>>? nil.to_s? ? ? ? #一切皆對(duì)象,nil也是對(duì)象,響應(yīng)to_s方法
=>? ""
>> puts "It's a palindrome!" if s == s.reverse ? ? ? #簡(jiǎn)單的回文測(cè)試
數(shù)組和值域
數(shù)組是一組具有特定順序的元素。Ruby中可以包含不同類(lèi)型的數(shù)據(jù)。
split 方法
>>? "gong yang bo".split? ? ? ? #把字符串拆分成有三個(gè)元素的數(shù)組
=>? ["gong", "yang", "bo"]
默認(rèn)情況下,split在空格處把字符串拆分成數(shù)組,不過(guò)也可以在幾乎任何地方拆分:
>> "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]
上面的方法都沒(méi)有修改 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ì)象的類(lèi),定義的時(shí)候可以使用范圍操作符“..”或者“...”,“..”生成的范圍對(duì)象包括起點(diǎn)和終點(diǎn),“...”生成的范圍對(duì)象不包括起點(diǎn)和終點(diǎn),范圍是由是一序列有順序、有規(guī)律的元素對(duì)象組成,任何有順序,有規(guī)律的一組對(duì)象,都可以用Range對(duì)象來(lái)定義,如數(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 中用來(lái)定義塊變量。只有方法本身才知道如何處理后面跟著的塊。這里,值域的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)常使用簡(jiǎn)寫(xiě)形式:
>> %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"