欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
第1章 Ruby工作原理 -Ruby for Rails中文版
 
第1章 Ruby工作原理 -Ruby for Rails中文版
==========================================
本章內容
Ruby起步指南
Ruby編程環(huán)境概覽
一個(gè)完整的Ruby程序示例
本書(shū)將為你打下堅實(shí)的Ruby基礎,而本章是基礎中的基礎。
我們將介紹Ruby的工作原理:編寫(xiě)程序時(shí)你要做些什么,如何讓Ruby運行程序,以及如何將一個(gè)程序分割成多個(gè)文件。你將學(xué)習Ruby解釋器運行過(guò)程中(實(shí)際的程序名是ruby,你的程序是由它來(lái)執行的)的幾個(gè)變化,以及如何使用一些重要的輔助工具,使Ruby程序員(更流行的叫法是Ruby人)的日子過(guò)得更輕松一些,也更高效一些。
首先對Ruby做一個(gè)較為詳細的介紹,更詳細的介紹留待以后。但你仍然可以在本章學(xué)到幾個(gè)非常特別的、實(shí)際且有用的Ruby技術(shù)。畢竟,為了啟動(dòng)編寫(xiě)和運行實(shí)際程序的過(guò)程,你需要編寫(xiě)和運行實(shí)際的程序。這些程序要保持簡(jiǎn)單——在Ruby中,某些最簡(jiǎn)單的東西往往是最常用且最強大的。你在本章所看到的Ruby代碼是真實(shí)的實(shí)戰代碼。
1.1 編寫(xiě)Ruby程序的基本過(guò)程
本節將帶你進(jìn)行編寫(xiě)和運行Ruby程序的實(shí)際過(guò)程。如果某些東西一時(shí)看起來(lái)很神秘,請不必擔心。我們采用的廣度優(yōu)先方法將幫助你從頭到尾經(jīng)歷整個(gè)編程周期。這隨后會(huì )有助于你掌握本章其余部分的內容以及第二部分和第三部分對Ruby語(yǔ)言詳細討論的內容。
注釋    Ruby,ruby,以及……RUBY都表示什么? Ruby是一門(mén)編程語(yǔ)言。我們會(huì )說(shuō)“學(xué)習Ruby”,也會(huì )問(wèn)“你知道Ruby嗎?”小寫(xiě)ruby表示一個(gè)計算機程序,明確地說(shuō),就是Ruby解釋器,即讀入并執行你的程序的程序。我們會(huì )說(shuō)“我運行ruby來(lái)執行我的文件,但是什么也沒(méi)發(fā)生”,或者“可執行文件ruby的完整路徑是什么”。最后,還有RUBY——確切地說(shuō),沒(méi)有這個(gè)詞。Ruby不是首字母縮寫(xiě)詞,全部用大寫(xiě)字母拼寫(xiě)它是不對的。有人這么做,他們也把Perl寫(xiě)成PERL,這都是錯誤的,可能是因為他們習慣看到類(lèi)似BASIC和FORTRAN這樣的語(yǔ)言名字。Ruby不是這樣的語(yǔ)言。Ruby表示語(yǔ)言,而ruby表示解釋器。
1.1.1 準備工作
現在你需要在計算機上安裝Ruby。安裝Ruby的過(guò)程在附錄中討論。在閱讀本章內容之前,你應該閱讀該附錄并且確保Ruby已經(jīng)安裝且可運行。
你還需要一個(gè)文本編輯器和一個(gè)目錄(有些平臺稱(chēng)文件夾)來(lái)保存你的Ruby程序文件??梢允褂萌魏文阆矚g的文本編輯器,甚至可以使用一個(gè)字處理程序,只要你可以將文件用純文本格式(舉例來(lái)說(shuō),不是Microsoft的Word格式、RTF或別的花哨格式)存儲且可以讓文件名以.rb(表示Ruby程序文件)作為擴展名。
認識交互式Ruby
給聲稱(chēng)自己沒(méi)耐心的人的建議——也是給所有人的建議:Ruby提供一個(gè)叫irb(交互式Ruby)的非常好的命令行工具。將命令和表達式鍵入irb后,它會(huì )立刻執行。irb由Keiju Ishitsuka編寫(xiě),是Ruby程序員不可缺少的工具,用它來(lái)實(shí)驗和使用Ruby將極大地加快你學(xué)習和熟悉Ruby的速度。
因為irb實(shí)際上是一種可選的Ruby解釋器,所以在1.2.2節前將不會(huì )詳細討論它。當然可以先跳到這一節翻閱一下irb,也可以立即開(kāi)始使用irb。只要有一個(gè)打開(kāi)的irb會(huì )話(huà),你就可以隨時(shí)測試任意數量的Ruby代碼片段。
同時(shí),我們將增長(cháng)你的Ruby知識,這樣我們就有了一個(gè)共同的基礎,在此基礎上繼續進(jìn)行構建和探索。
1.1.2 Ruby起步指南
作為起步,花點(diǎn)時(shí)間學(xué)習一些最常用的Ruby語(yǔ)法元素是值得的。通過(guò)對少量語(yǔ)法元素的意義的理解,即使你看到的代碼像個(gè)黑匣子,你仍然可以繼續前進(jìn)。
本章例子使用表1-1中列出的技術(shù)。為了讓Ruby起步過(guò)程盡可能輕松,我們把這些技術(shù)總結在這里,讓你現在可以提前閱讀,稍后可以參閱。但是,Ruby和Ruby語(yǔ)法的一些非?;A的方面,相互牽涉太多,不便用一個(gè)表來(lái)總結。至少需要具備一些基本知識,如Ruby中對象是什么,方法調用看起來(lái)是怎樣的。下面,我們首先就這兩點(diǎn)做一個(gè)簡(jiǎn)單的介紹(至于表中的具體條目,本書(shū)后面將更詳細地探討)。
表1-1 用于Ruby起步的Ruby語(yǔ)法關(guān)鍵元素概要

操    作

例    子
注    釋
算術(shù)操作
2 + 3(加法)
2 – 3(減法)
2 * 3(乘法)
2 / 3(除法)
例子中出現的是整數
也可以使用浮點(diǎn)數(如2.0)
往變量中放入一個(gè)值
x = 1
string = "Hello"
這被稱(chēng)為變量賦值

 

(續)

操    作

例    子
注    釋
在屏幕上輸出
puts "Hello"
print "Hello"
x = "Hello"
puts x
x = "Hello"
print x
x = "Hello"
p x
如果字符串不是以換行結束,puts給它輸出的字符串加一個(gè)換行
print精確地輸出被要求輸出的東西,光標會(huì )停在被輸出內容的行尾(請注意:在某些平臺上,程序末尾會(huì )自動(dòng)添加一個(gè)附加的換行)
p輸出一個(gè)inspect字符串, 它可能包含關(guān)于它正在輸出的是什么的附加信息
獲取一行鍵盤(pán)輸入
gets
string = gets
可以將輸入行直接賦值給一個(gè)變量(如第二個(gè)例子中的變量string)
將字符串轉換為整數
x = "100".to_i
s = "100"
x = s.to_i
為了執行算術(shù)運算,要確保使用的是數值而不是字符串。to_i執行從字符串到整數的轉換
比較兩個(gè)值
x == y
請注意使用的是雙等號(不像在賦值語(yǔ)句中,用的是一個(gè)等號)
條件執行
if x == y
# 執行此處的代碼
else
# 執行此處的代碼
end
條件語(yǔ)句永遠用單詞end結束
在代碼文件中放置注釋
#This is a comment line.
X = 1 # Comment to end of line
注釋被解釋器忽略

 

1.1.3 方法調用和Ruby對象的簡(jiǎn)單介紹
你在Ruby程序中看到的和編寫(xiě)的多是方法調用(method call)。方法調用有時(shí)僅僅由以裸詞形式出現的方法名構成,其后可能帶一個(gè)或多個(gè)參數。舉例來(lái)說(shuō),下面的代碼用一個(gè)參數調用puts方法。
另外一種方法調用使用一個(gè)特殊的語(yǔ)法——點(diǎn)操作符,它在其左側的值或表達式和其右側的方法名之間建立一個(gè)關(guān)系。如表1-1中的
其中的點(diǎn)意味著(zhù)給字符串“100”發(fā)送消息“to_i”,或者說(shuō)在字符串“100”上調用to_i方法。字符串“100”稱(chēng)為消息的接收者。
下面是一個(gè)使用完整的點(diǎn)記法的方法調用,它也帶一個(gè)參數。它從九進(jìn)制數100產(chǎn)生一個(gè)十進(jìn)制整數。
x現在等于十進(jìn)制的81。
從這個(gè)例子也可看到,方法參數由圓括號括起來(lái)。這些圓括號通常是可選的,但在較復雜的情況下,為消除可能的語(yǔ)法歧義性,它們可能是必需的。很多程序員在大多數或全部的方法調用中使用圓括號,就是為了安全(以及視覺(jué)上的清晰性)。
在這些例子中,字符串“100”是消息“to_i”的接收者。本質(zhì)上,你在要求該字符串將自己轉換成整數。字符串自身是一個(gè)對象。Ruby程序完全由發(fā)送到對象的消息組成。對象可以是一個(gè)字符串(如剛才的例子),也可以是一個(gè)整數——可能是一個(gè)想要轉換成字符串的整數。
在編寫(xiě)Ruby程序時(shí),大多數的時(shí)間要么花在告訴Ruby你希望對象能夠做什么,即你希望它們能理解什么消息上,要么花在給對象發(fā)送消息上。你的對象世界并不局限于Ruby已有的那些對象,如字符串和整數。如果你正在編寫(xiě)Rails應用,其中的一個(gè)實(shí)體模型是Customer,那么當你編寫(xiě)代碼來(lái)觸發(fā)一些操作,如客戶(hù)登錄一個(gè)站點(diǎn),更新客戶(hù)的電話(huà)號碼,在客戶(hù)的購物車(chē)中加入商品,所有這些可能的操作,實(shí)際上都是在給Customer對象發(fā)送消息。
在本書(shū)后面我們將更深入地探討這些問(wèn)題。再重復一下,這個(gè)簡(jiǎn)單的描述只是為了達到Ruby起步的目的。當你看到圓點(diǎn)位于一個(gè)不這樣就無(wú)法解釋的位置時(shí),你應該把它理解為:正在給(左邊的)對象發(fā)送(右邊的)消息。
1.1.4 編寫(xiě)和保存示例程序
在具備了某些Ruby的知識(以及一張可以在遇到問(wèn)題時(shí)查閱的總結表)之后,讓我們遍歷運行一個(gè)程序的各步驟。強烈建議讀者把本書(shū)的例子單獨做成一個(gè)目錄。類(lèi)似于下面這樣的就可以了:
從現在起,本書(shū)將假設所有的示例程序都保存在這個(gè)目錄中。某些情況下,這無(wú)關(guān)緊要,但在很多情況下這么做很重要,特別是當你開(kāi)始編寫(xiě)使用多個(gè)文件的程序時(shí),這些文件必須能夠容易地找到彼此。
現在,你將生成一個(gè)程序文件。該程序是一個(gè)攝氏—華氏溫度轉換程序。我們將分階段地完成這個(gè)例子,每個(gè)階段為它增加功能或修改它。第一版非常簡(jiǎn)單,因為重點(diǎn)是生成文件和運行程序的過(guò)程。
生成第一個(gè)程序文件
為生成下面這個(gè)Ruby程序文件以及以后的Ruby程序文件,你可以使用任意的文本編輯器(vi、Emacs、記事本等);本書(shū)所有說(shuō)明和解釋都與特定編輯器無(wú)關(guān)。請記住,如果你使用了字處理程序,你必須將文件保存為純文本文件。
請在文本文件中鍵入代碼清單1-1中的代碼,并在ruby4rails目錄下用文件名c2f.rb將其保存。
代碼清單1-1 簡(jiǎn)單、功能有限的攝氏—華氏溫度轉換程序(c2f.rb)
現在,在你的硬盤(pán)上就有了一個(gè)完整的小Ruby程序,你可以運行它了。
注釋    運行獨立的Ruby程序 也許你的操作系統允許運行獨立的Ruby程序——即僅僅使用文件名或一個(gè)不帶擴展名的短文件名(如c2f)。但是請記住,就文件命名來(lái)說(shuō),.rb擴展名在某些情況下是必需的,主要是在涉及多文件程序時(shí)(你將在后面詳述地學(xué)習),這些文件需要一個(gè)機制找到彼此。在本書(shū)中,所有的Ruby程序都使用.rb后綴,以確保這些例程可以工作在盡可能多的平臺上。
1.1.5 提交Ruby程序
編寫(xiě)和運行Ruby程序這一過(guò)程的中心工作是向Ruby解釋器(ruby)提交程序的源文件。你現在就要這樣做。你將向ruby提交程序,但不是讓它運行該程序,而是讓它檢查程序代碼(文件中的Ruby代碼行)的語(yǔ)法錯誤。
1.語(yǔ)法錯誤檢查
如果你不小心在c2f.rb中的方法調用print的中間鍵入了一個(gè)空格(pr int),這就構成了一個(gè)語(yǔ)法錯誤。如果你忘記在注釋行前面鍵入#字符,肯定就引入了一個(gè)語(yǔ)法錯誤。(除非湊巧這個(gè)注釋正好是正確的Ruby代碼?。?/div>
Ruby解釋器可以很方便地在不運行程序的情況下檢查程序的語(yǔ)法錯誤。它遍歷整個(gè)文件并且告訴你語(yǔ)法是否正確。請使用下面的命令文件進(jìn)行語(yǔ)法檢查:
-c標志的意思是檢查,即檢查語(yǔ)法錯誤。-w標志激活更高級別的警告。如果你所編寫(xiě)的Ruby代碼,雖然合法但有疑問(wèn),Ruby會(huì )提示你。
假設編寫(xiě)的文件是正確的,屏幕上會(huì )出現這條消息
2.運行程序
再次向解釋器提交文件運行程序,但是這次沒(méi)有–c和–w標志:
如果順利,計算結果如下:
3.一點(diǎn)小問(wèn)題
計算結果是正確的,但是輸出分散在三行,看起來(lái)不是很好。你希望它們都出現在一行里。
4.修正第一個(gè)Ruby錯誤
問(wèn)題可以追溯到puts命令和print命令的差別上。如果被輸出字符串不是以換行符結尾的,puts會(huì )在輸出的字符串后面加一個(gè)換行。print正好相反,輸出你讓它輸出的字符串就停止,不會(huì )自動(dòng)跳到下一行。
為修正這個(gè)問(wèn)題,可以將頭兩個(gè)puts命令改為print。
(注意is后的空格,它保證is和數字之間留有間距。)現在輸出是這樣的:
puts是put(即Print)string的縮寫(xiě)。盡管put這個(gè)記法可能不能直觀(guān)地表達跳到下一行的意思,但那就是puts的功能。和print一樣,它輸出你要求的東西,但是它還自動(dòng)跳到下一行。如果你讓puts輸出以換行符結尾的行,它不會(huì )再加一個(gè)換行。
如果你習慣了其他語(yǔ)言中的不自動(dòng)加換行的輸出設施(如Perl的print函數),那么當你想輸出后面帶換行的值時(shí),你可能會(huì )在Ruby中這樣寫(xiě)代碼:
puts就是為你做這個(gè)的。往后你會(huì )慢慢習慣puts,以及其他的Ruby慣用法和約定。
警告    你可能不想要的額外的換行 在一些平臺(特別是Windows)上,當運行完程序時(shí),會(huì )輸出一個(gè)額外的換行符。這意味著(zhù)一個(gè)本來(lái)應該是puts的print很難被發(fā)現,因為它表現得就像一個(gè)puts。意識到它們的差別,按慣例進(jìn)行選擇,應該足以保證得到想要的結果。
與輸出相對應的就是數據的輸入。不是每個(gè)程序都會(huì )像之前的程序,帶著(zhù)所有它需要編入自身的數據出現。數據有很多來(lái)源。在一般的Rails應用中,它來(lái)自數據庫。在普通的Ruby用法中,程序數據常常來(lái)自鍵盤(pán)和文件。下面我們將介紹Ruby如何處理這些形式的輸入。
1.1.6 鍵盤(pán)和文件輸入
Ruby為在程序執行過(guò)程中的數據讀寫(xiě)提供了很多技術(shù)。你可能會(huì )發(fā)現,作為一個(gè)Rails開(kāi)發(fā)者,相對來(lái)說(shuō)很少使用這些設施,因為Rails為你做了數據獲取工作。而你的用戶(hù),當他們用鍵盤(pán)輸入時(shí),通常都是在Web表單中輸入。
盡管如此,還是需要學(xué)習基本的Ruby鍵盤(pán)輸入和文件I/O操作。如果雖然你不是在編寫(xiě)每一個(gè)Rails應用時(shí)都用到,但是在編寫(xiě)Ruby代碼來(lái)維護、轉換、日常管理或操縱你所工作的環(huán)境的時(shí)候,你肯定會(huì )用到它們。
1.鍵盤(pán)輸入
一個(gè)只能一遍一遍告訴你100°C相當于212°F的程序沒(méi)有什么實(shí)用價(jià)值。更有價(jià)值的程序可以讓你任意指定一個(gè)攝氏溫度,然后告訴你相應的華氏溫度。
要改變程序以實(shí)現此功能,涉及增加幾個(gè)步驟以及使用兩個(gè)方法(其中一個(gè)你已經(jīng)熟悉):
gets暫停程序并等待來(lái)自鍵盤(pán)的一行輸入。(敲擊回車(chē)鍵產(chǎn)生的換行符作為最后一個(gè)字符包含在輸入行中。)
to_i將字符串轉換為整數。為了使輸入的字符串可以與計算華氏結果時(shí)用到的其他數值協(xié)調工作,你需要這個(gè)方法。
因為這是一個(gè)新程序,而不僅僅是一個(gè)修正,所以請將代碼清單1-2中的程序版本放入一個(gè)新文件(c2fi.rb;i表示交互的,即interactive):
代碼清單1-2 交互式溫度轉換程序(c2fi.rb)
注意這里使用了print而不是puts以控制輸出的換行。
以下幾個(gè)運行結果說(shuō)明了新程序的行為:
注釋    縮減代碼 通過(guò)合并輸入、計算和輸出操作,可以大幅度地縮減代碼。一個(gè)重寫(xiě)的壓縮過(guò)的代碼是這樣的:
          
             這個(gè)版本節省了變量——未用任何變量,但是要求讀它的人理解一個(gè)更密集也更短的表達式。任何程序中通常有些地方需要你在長(cháng)而清晰和短而隱晦之間進(jìn)行選擇。也有些時(shí)候,短的可能更清晰。這都是形成Ruby編碼風(fēng)格所需要考慮的。
2.文件輸入的例子
從Ruby程序讀入文件并不比從鍵盤(pán)讀入一行困難多少。你將在這里嘗試:從文件中讀入一個(gè)數,并將其從攝氏轉換到華氏。(有時(shí)從文件中讀數據確實(shí)比這要麻煩一些,但該例子展現了基本的操作。)
首先,生成一個(gè)叫temp.dat的新文件(溫度數據文件),該文件僅包含一行,該行只有一個(gè)數:
現在,生成如代碼清單1-3所示的名為c2fin.rb(in表示[文件]輸入)的第三個(gè)程序文件。
代碼清單1-3 使用文件輸入的溫度轉換程序(c2fin.rb)
這一次,例子的運行和它的輸出是這樣的:
很自然地,如果你改變文件中的數,結果就會(huì )不同。
因為對稱(chēng)的原因——也考慮到實(shí)用性,因為你可能在某些時(shí)候想這么做——讓我們看看,編寫(xiě)一個(gè)將結果保存到文件的程序,需要做些什么。
3.文件輸出的例子
最簡(jiǎn)單的寫(xiě)文件操作比最簡(jiǎn)單的讀文件操作要復雜一點(diǎn)(但不是復雜很多)。如果細查代碼,你可以看到,在打開(kāi)文件準備寫(xiě)的時(shí)候,需要額外指定的主要就是文件打開(kāi)模式——在這個(gè)例子里是w(表示寫(xiě))。
將代碼清單1-4中的程序版本保存到c2fout.rb,然后運行它。
代碼清單1-4 使用文件輸出的溫度轉換程序(c2fout.rb)
(變量fh表示文件句柄。請注意你使用puts——實(shí)際上是fh.puts,指向文件句柄fh的引用將輸出引導到文件流中而不是屏幕上——向文件句柄所代表的文件中輸出一行。)
如果檢查文件temp.out,應該看到它包含了輸入的數的華氏溫度對應數。
4.讀者練習
根據前面的例子,你可以編寫(xiě)一個(gè)從文件中讀出一個(gè)數,并將華氏轉換結果保存到另一個(gè)文件中的Ruby程序嗎?
1.1.7 一個(gè)程序,多個(gè)文件
到此為止,我們已經(jīng)動(dòng)手編寫(xiě)和執行了一個(gè)Ruby程序,這涉及兩個(gè)實(shí)體:程序文件和Ruby解釋器。當你開(kāi)始編寫(xiě)更長(cháng)的程序時(shí),或者當你讀更長(cháng)、更復雜的應用程序包括Rails應用程序和Rails本身時(shí),你會(huì )很快發(fā)現,很少有程序只有一個(gè)文件。除非你在編寫(xiě)某些確實(shí)很小巧的東西,如攝氏—華氏轉換程序,否則你的程序很可能超過(guò)兩三個(gè)文件,在某些情況下會(huì )多達幾十個(gè)文件。
信不信由你,這是一個(gè)好消息。
確實(shí),將程序放在一個(gè)文件中,可以讓你一次看到全部東西。但當你有成百上千或幾十萬(wàn)行代碼時(shí),這就變成負擔而不是好處了。將程序拆成多個(gè)單獨的文件是很有意義的。
1.請求加載文件
當你的程序分散在多個(gè)文件中時(shí),作為一個(gè)程序來(lái)運行最常用的技術(shù)是require命令(更準確地說(shuō)是require方法),它在一個(gè)文件運行過(guò)程中讀入另一個(gè)文件。
為了說(shuō)明require的使用方法,你需要一個(gè)編寫(xiě)在兩個(gè)文件上的程序(這不奇怪)。第一個(gè)文件reqdemo.rb應該包含以下Ruby代碼:
當碰到require方法調用時(shí),Ruby讀入第二個(gè)文件,即requiree.rb,它應該是這樣的:
現在,用Ruby運行reqdemo.rb,可以看到如下結果:
這個(gè)程序沒(méi)有太多功能,它只是對于使用多文件程序過(guò)程的一個(gè)概念驗證式的說(shuō)明,但是你可以從輸出的信息看到,第二個(gè)文件requiree.rb是在第一個(gè)文件中require語(yǔ)句所在的位置開(kāi)始執行的。
實(shí)質(zhì)上,require查找另一個(gè)文件并執行它(假設找到的話(huà))。如果沒(méi)有找到,程序將以一個(gè)致命錯誤終止。
2.加載文件
load是require的近親。它們的主要區別在于,如果執行下面的代碼:
第二次執行require什么都不會(huì )發(fā)生,而如果執行下面的代碼:
Ruby會(huì )兩次讀入該文件。
在同一個(gè)文件中的一行中兩次加載同一個(gè)文件幾乎是毫無(wú)意義的,但在某些時(shí)候,這種多次加載是有用的。舉例來(lái)說(shuō),在開(kāi)發(fā)模式下,相對于require,Rails更傾向于使用load——這意味著(zhù),在瀏覽器中試運行應用程序的同時(shí)修改代碼,這些修改會(huì )被重新加載,覆蓋Web服務(wù)器部分的緩存行為。如果應用程序已經(jīng)加載了一次文件,在同樣的地方多次調用require不會(huì )有這樣的效果。
在通常的Ruby編程和Rails框架中,多個(gè)文件可以一起工作的設施非常重要。你將在本書(shū)的第四部分特別是第17章看到多文件交互的例子,在那里,我們將深入學(xué)習Rails的源代碼。不管是合在一起還是分開(kāi)來(lái)看,文件到文件的連接使得Ruby和Rails是內聚的。
現在,讓我們回到基本的Ruby過(guò)程場(chǎng)景。
===========================================
1.2 激活解釋器的方法
你大概已經(jīng)經(jīng)歷了一次Ruby程序的整個(gè)過(guò)程?,F在可以回去看看更多的內容。
正如已經(jīng)提到過(guò)的,當你運行Ruby程序時(shí),實(shí)際上是在運行一個(gè)叫ruby的程序,并將你的程序作為輸入提交給它。在這里,我們將看一下在此過(guò)程中你可以得到的更多的選擇。這些選擇包括命令行開(kāi)關(guān)(如你已經(jīng)看到過(guò)的–cw語(yǔ)法檢查標志的例子),不用在命令行激活ruby也可以將你的程序定向到Ruby解釋器的技術(shù),以及如何運行irb解釋器的詳細信息。
1.2.1 命令行開(kāi)關(guān)
從命令行啟動(dòng)Ruby解釋器時(shí),你不僅可以提供程序文件的名字,而且可以提供一個(gè)或多個(gè)命令行開(kāi)關(guān)。你選擇的開(kāi)關(guān)指示解釋器以一種特定的方式運轉,并且/或者執行特定的操作。
Ruby命令行開(kāi)關(guān)有20多個(gè),其中有些很少使用,有些則每天被很多Ruby程序員使用。在這里我們將再看幾個(gè)最常用的。(你已經(jīng)看到過(guò)其中的兩個(gè),-c和–w,它們結合在一起使用。)這些常用的開(kāi)關(guān)總結在表1-2中,我們將分別給予解釋。
表1-2 常用的Ruby命令行開(kāi)關(guān)總結

命令行開(kāi)關(guān)

描  述
例    子
-c
不執行程序,只檢查(check)程序文件的語(yǔ)法
ruby –c c2f.rb
-w
在程序執行過(guò)程中給出警告(warnig)信息
ruby –w c2f.rb
-e
執行(execute)在命令行中引號內的代碼
ruby –e 'puts"code demo! "'
-v
顯示Ruby版本(version)信息,在詳信(verbose)模式下執行程序
ruby –v
-l
行(line)模式:如果沒(méi)有換行則在每一行輸出后輸出一個(gè)換行
ruby –l –e 'print "Will jump down! "'
-rname
加載指定的擴展(require)
ruby –rprofile
--version
顯示Ruby版本(version)信息
ruby --version

 

1. 語(yǔ)法檢查(-c)
-c開(kāi)關(guān)告訴Ruby檢查一個(gè)或多個(gè)文件中代碼語(yǔ)法的正確性而不用執行代碼。它常常與–w標志一起使用。
2.打開(kāi)警告(-w)
用-w運行程序使得解釋器在警告模式中運行。這意味著(zhù)你將看到比不用該開(kāi)關(guān)時(shí)更多的警告輸出到屏幕上,這會(huì )將你的注意力吸引到程序中雖然語(yǔ)法正確、但風(fēng)格和邏輯讓人懷疑的地方。這相當于Ruby在說(shuō):“你已經(jīng)完成的沒(méi)有語(yǔ)法錯誤,但是很怪異。你確信要這么做嗎?”(即使沒(méi)有設置這個(gè)開(kāi)關(guān),Ruby也會(huì )發(fā)出某些警告,但是比在完全的警告模式中要少。)
3.執行字面腳本(-e)
-e開(kāi)關(guān)告訴解釋器:命令行包含了Ruby代碼,它們在引號中,解釋器應該執行這些代碼而不是文件中的代碼。這便于執行快速的腳本任務(wù),在這種情況下,如果把代碼輸入到一個(gè)文件中,并使用ruby來(lái)執行該文件,很是麻煩。
舉例來(lái)說(shuō),你想要倒過(guò)來(lái)看你的名字。以下是使用執行開(kāi)關(guān),以一個(gè)命令行的命令來(lái)快速實(shí)現此功能的代碼。
單引號中的內容是一個(gè)完整的Ruby程序(雖然很短)。如果你想提交超過(guò)一行的程序給-e開(kāi)關(guān),你可以在這個(gè)小程序中使用字面分行。
或者,你可以使用分號來(lái)分隔行。
注釋    在反轉的字符串中的換行符 為什么在這個(gè)兩行代碼的反轉程序示例中,在程序代碼和輸出之間有一個(gè)空行?這是因為你通過(guò)鍵盤(pán)輸入的行以一個(gè)換行符結尾——那么當反轉輸入時(shí),新的字符串是以一個(gè)換行符開(kāi)始的。當你讓Ruby處理和輸出數據時(shí),它總是字面地理解你的意思。
4.在行模式下運行(-l)
回顧第一版攝氏溫度轉換程序的執行結果,可以看到Ruby的輸出——數值212——與shell的命令提示符($字符)連在一起出現在屏幕上。原因正如你前面所看到過(guò)的,是因為你使用的是print而不是puts,所以在該數值后面沒(méi)有換行符。
-l開(kāi)關(guān)確保各輸出行放到單獨的行里。當你不確定要輸出的行是否以換行符結尾時(shí),這是很方便的。在大多數情況下,你可以使用puts,但是在對代碼沒(méi)有控制權的情況下–l開(kāi)關(guān)可以幫助你。
比如說(shuō)某人編寫(xiě)了一個(gè)程序,該程序遍歷文件中的所有姓名并輸出名。不知為何,他使用了print而不是puts,于是,用一般的姓名文件來(lái)運行此程序,其輸出是這樣的:
現在,你想要使用該程序,但你想讓每一個(gè)名出現在不同的行中。你可以告訴Ruby以行模式運行,這樣你將得到你想要的:
你不會(huì )像使用puts那樣經(jīng)常地使用–l標志來(lái)達到類(lèi)似的效果。但是它是有用的,而且你也需要了解它。
5.請求加載指定的文件或擴展名
-r開(kāi)關(guān)在命令行指定請求加載(require)的文件。正如你將看到的,require更大的用途是激活擴展(外加的程序功能)。你也可以用–r標志來(lái)實(shí)現require的這種特點(diǎn)。
6.在verbose模式下運行(-v)
運行-v做兩件事:輸出當前使用的Ruby的版本信息,然后打開(kāi)與–w一樣的警告機制。-v最常用于給出Ruby的版本號:
(在這個(gè)例子中,我們使用的是Ruby 1.8.2,它是2004年圣誕節發(fā)布的,是針對運行Linux的基于i686的機器編譯的。)因為沒(méi)有程序或代碼需要運行,Ruby在輸出完版本號后立即退出。
7.輸出Ruby版本
很明顯,--version這個(gè)標志與–v很像,但是它只輸出Ruby版本信息。它不繼續執行任何代碼,即使你提供了代碼或文件名。它只輸出版本信息然后就退出。相對于ruby--version,ruby–v更常用。
8. 組合開(kāi)關(guān)
常常需要在一次Ruby運行中組合使用多個(gè)命令行開(kāi)關(guān)。
你已經(jīng)見(jiàn)過(guò)cw組合,它檢查程序文件的語(yǔ)法但不執行,同時(shí)還給出警告。
另一個(gè)常見(jiàn)的開(kāi)關(guān)組合是–v和–e,它給出當前Ruby的版本信息并運行引號中給出的代碼。你經(jīng)常會(huì )在郵件列表或別的地方的Ruby討論中看到這個(gè)組合人們用它來(lái)說(shuō)明同樣的代碼在不同版本的Ruby中的不同的行為。舉例來(lái)說(shuō),如果你想說(shuō)明Ruby 1.6.8沒(méi)有而Ruby 1.8.2有lstrip操作(剝去一個(gè)字符串左側的所有空白字符),你可以先用第一個(gè)版本的Ruby來(lái)運行一個(gè)例子程序,然后換另一個(gè)版本的Ruby:
第一遍運行時(shí)(使用版本1.6.8)給出消息“undefined method 'lstrip'”,意味著(zhù)我們試圖執行一個(gè)不存在的指定操作。但當使用Ruby 1.8.2來(lái)運行同樣的代碼片段時(shí),它可運行,Ruby輸出abc(不帶開(kāi)頭的空白)。這個(gè)辦法可以用來(lái)解釋和展示Ruby從一個(gè)版本到另一個(gè)版本所做的改變方面的信息和問(wèn)題。
至此,我們將回過(guò)頭去更詳細地介紹交互式Ruby解釋器:irb。你可能已經(jīng)看過(guò)這一節,在本章的開(kāi)始我們提到過(guò)它。如果還沒(méi)有,現在你可以借此機會(huì )學(xué)習一下這個(gè)非常有用的Ruby工具。
1.2.2 進(jìn)一步了解交互式Ruby解釋器irb
使用Ruby最開(kāi)心的事之一就是使用irb了。irb是一個(gè)交互式的解釋器,即它不是處理文件,而是在會(huì )話(huà)中處理你鍵入的內容。irb是測試Ruby代碼的一個(gè)很好的工具,也是學(xué)習Ruby的一個(gè)很好的工具。
為啟動(dòng)一個(gè)irb會(huì )話(huà),可以使用命令irb。irb會(huì )輸出提示符:
現在,就可以鍵入Ruby命令了。甚至可以運行攝氏—華氏轉換程序的只執行一次的版本。正如你將看到的,irb的行為像一臺袖珍計算器:它可求出所鍵入的任意的數的值,然后輸出結果。不需要使用print或者puts命令:
為計算一年中有多少分鐘,請鍵入相應的乘法表達式:
irb當然也處理你鍵入的任意的Ruby指令。舉例來(lái)說(shuō),如果想將天數、小時(shí)數或分鐘數賦值給變量,然后相乘這些變量,則可以在irb中這樣做:
最后的計算結果是你所的期望的。但是看一下輸入的前三行。當鍵入days = 365時(shí),irb輸出365作為應答。這是為什么?
表達式days = 365是一個(gè)賦值表達式:你將值365賦給days變量。賦值表達式主要任務(wù)是賦值,以后你就可以使用被賦值的變量。但是賦值表達式自身days = 365作為一個(gè)整體也有一個(gè)值。賦值表達式的值就是等號右側的值。當irb碰到任意的表達式時(shí),它輸出該表達式的值。所以,當irb碰到days = 365時(shí),它輸出365。這個(gè)輸出看起來(lái)是過(guò)于熱心了,但它有它的原因;這與你在irb中鍵入2+2然后不必顯式地使用print語(yǔ)句就能看到結果的做法是一樣的。
一旦你掌握了irb輸出每一個(gè)東西的值的方式,你會(huì )發(fā)現它是一個(gè)非常有用的工具(也是玩具)。
提示    退出irb(有意的或無(wú)意的) 如果irb在一個(gè)循環(huán)或僵局中卡住了,敲Ctrl-c強制退出。要正常退出,敲Ctrl-d或鍵入exit。偶爾,irb可能會(huì )“發(fā)脾氣”(碰到一個(gè)致命錯誤而終止)。但大多數時(shí)候,它會(huì )捕獲自己的錯誤,讓你繼續工作。
我們關(guān)于Ruby全景的下一個(gè)旅程是Ruby擴展和庫??匆幌逻@些設施將使你了解核心語(yǔ)言怎么與外部擴展交互——這些外部擴展要么與Ruby綁定在一起發(fā)行,要么由有志于豐富Ruby開(kāi)發(fā)環(huán)境的第三方程序員獨立發(fā)行。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久