qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          ruby開學(xué)!

          至于怎么安裝ruby 我就不多說了  網(wǎng)上到處都是 人不能太懶 ,我在windows和linux下都安裝了  親  學(xué)習(xí)要靠自己哦

          http://blog.csdn.net/gumanren/article/details/4914586(Eclipse 集成ruby的環(huán)境插件)



          介紹

          這是一個(gè)短小的Ruby入門,完全讀完只需20分鐘。這里假設(shè)讀者已經(jīng)安裝了Ruby,如果你沒有安裝的話,請(qǐng)?jiān)陂喿x文前訪問Ruby官方網(wǎng)站進(jìn)行下載并安裝。

          交互式的Ruby

          打開IRB(交互式Ruby外殼):
          如果你使用Mac OS X,那么請(qǐng)打開終端窗口輸入irb;
          如果你使用Linux,那么請(qǐng)打開shell輸入irb;
          如果你使用windows,那么請(qǐng)?jiān)陂_始菜單中找到Ruby->fxri,并執(zhí)行它。

          image   

          Ok,在打開IRB之后,在其中輸入"Hello World"。

          image

          Ruby聽從你的安排!   

          發(fā)生了什么?我們剛才編寫了世界上最短小的“Hello World”程序嗎?這么說不太確切。第二行輸出是IRB告訴我們:上一個(gè)表達(dá)式的評(píng)估結(jié)果。如果我們希望打印出“Hello World”,那么就還需要一點(diǎn)努力:

          image

          puts在Ruby中是一個(gè)簡(jiǎn)單的打印輸出命令。后面的“=> nil”表示什么?——那是表達(dá)式的結(jié)果。Puts總是返回nil,這是Ruby中表示“絕對(duì)無值”(absolutely-positively- nothing value)的方式,看上去有些類似Java中的null。

          你的免費(fèi)計(jì)算器在這里!

          無需做什么,我們就能把IRB作為一個(gè)簡(jiǎn)單的計(jì)算器使用:

          image

          這樣就能計(jì)算3+2。夠簡(jiǎn)單的!那么3乘以2如何?你可以在下面繼續(xù)輸入3*2,也可以回到上面(3+2處)重新修改你剛剛輸入的計(jì)算公式。使用鍵盤上的向上鍵,使光標(biāo)到達(dá)3+2那一行,再用左鍵移動(dòng)光標(biāo)到加號(hào)上,然后使用空格鍵進(jìn)行修改。

          image   

          下面,讓我們嘗試計(jì)算3的平方:

          image  

          在Ruby語言中,**表示冪運(yùn)算。那么如何計(jì)算平方根呢?

          image

          Ok,等一下,表達(dá)式中的sqrt(9)表示什么?你一定能猜到這是計(jì)算9的平方根。而Math表示什么?不要著急,下面就讓我們進(jìn)一步了解像Math這樣的模塊。

          模塊——按照主題分組的代碼

          Math是Ruby內(nèi)建的數(shù)學(xué)模塊。在Ruby中,模塊提供了兩種角色:一種角色是將類似的方法聚集在同一個(gè)“家 族”名下。因此,Math也包括sin、tan這樣的方法。第二種角色是一個(gè)圓點(diǎn)(dot),它標(biāo)記了消息的接收者。什么是消息?在上面的例子 中,sqrt(9)便是消息,它意味著調(diào)用sqrt方法取出9的平方根。

          Sqrt方法調(diào)用的結(jié)果是3.0。你可能注意到它并不是3。這是因?yàn)槎鄶?shù)情況下,數(shù)字的平方根并不是整數(shù),所以這里返回了一個(gè)浮點(diǎn)數(shù)。

          那么我們?nèi)绾斡涀∵@些計(jì)算結(jié)果呢?——將結(jié)果賦值給變量。

          image


          這是一個(gè)短小的Ruby入門,完全讀完只需20分鐘。讓我們從編寫世界上最簡(jiǎn)單的“Hello,World”程序開始逐步深入了解Ruby的類、block、迭代器等特征,也許這對(duì)你來講還遠(yuǎn)遠(yuǎn)不過,但對(duì)于20分鐘的入門來講已經(jīng)非常難得了。

          AD:

          如何定義方法?

          如何才能方便省事地隨意輸出字符串,而無需過多地勞煩我們的手指呢?——我們需要定義一個(gè)方法!

          image

          上面的代碼中第一行“def h”標(biāo)志著方法定義的開始。它告訴Ruby我們正在定義一個(gè)名為h的方法。下面一行是方法體:puts "Hello World"。最后,也就是第三行“end”通知Ruby我們完成了方法定義。Ruby的回應(yīng)“=> nil”告訴我們它已經(jīng)知道我們定義了此方法。

          簡(jiǎn)短、重復(fù)地調(diào)用方法

          現(xiàn)在,讓我們嘗試多次執(zhí)行這個(gè)方法:

          image    

          哈,這太容易了。在Ruby中調(diào)用某個(gè)方法只需將方法名提交給Ruby。當(dāng)然,這是在方法沒有參數(shù)的情況下。如果你愿意也可以添加一個(gè)空白的括號(hào),但是這沒有必要。

          如果我們想對(duì)某個(gè)人說hello而不是整個(gè)“世界”(world),那該怎么做?——重定義h方法使它接收name參數(shù)。

          image

          嗯,現(xiàn)在看來工作正常。

          字符串中的奧秘 

          “#{name}”是什么意思?這是Ruby在某個(gè)字符串中插入其它字符的方式。在大括號(hào)之間放入的字符串(這里是指name)將被外部的字符串代替。你也可以使用字符串類內(nèi)建的capitalize方法來確保某人名字的首字母大寫:

          image

          上面的代碼有兩個(gè)地方需要說明:

          第一,我們通過無括號(hào)的方式調(diào)用方法,因?yàn)槔ㄌ?hào)是可選的;

          第二,這里的默認(rèn)參數(shù)值為“World”。也就是說在調(diào)用方法時(shí)如果沒有提供name參數(shù),則使用默認(rèn)值“World”。

          進(jìn)化為Greeter!

          我們是否需要一個(gè)真正的問候者(greeter),他能記住你的名字、問候你、總是尊重地向你示好?那么這就最好建立一個(gè)“Greeter”類:

          image

          在上面的類代碼中定義了一個(gè)稱為Greeter的類和一些類方法,其中出現(xiàn)了一些新的“關(guān)鍵詞”:請(qǐng)注意“@name”,它是類的實(shí)例變量,并對(duì)類中的所有方法(say_hi和say_bye方法)都有效。

          這是一個(gè)短小的Ruby入門,完全讀完只需20分鐘。讓我們從編寫世界上最簡(jiǎn)單的“Hello,World”程序開始逐步深入了解Ruby的類、block、迭代器等特征,也許這對(duì)你來講還遠(yuǎn)遠(yuǎn)不過,但對(duì)于20分鐘的入門來講已經(jīng)非常難得了。

          AD:

          如何讓Greeter類發(fā)揮作用?現(xiàn)在讓我們來建立一個(gè)Greeter對(duì)象并使用它!

          image

          Greeter類的實(shí)例對(duì)象g被建立后,它便接受了name參數(shù)(值為Pat)。那么我們能直接訪問name嗎?

          image

          看看上面的編譯錯(cuò)誤來看,這樣直接訪問name是行不通的。 

          窺視對(duì)象的內(nèi)部    

          對(duì)象中的實(shí)例變量總是隱藏于其中,但也并非毫無蹤跡可尋,通過審查(inspect)對(duì)象便會(huì)見到它們。當(dāng)然還有其它的訪問方法,但是Ruby采用了良好的面向?qū)ο蟮姆绞絹肀3謹(jǐn)?shù)據(jù)的隱藏性。

          image

          喔!這么多方法,可是我們只定義了兩個(gè)方法呀?其它的方法又出自何處?不要擔(dān)心,instance_methods方法列出了Greeter對(duì)象的 所有方法,其中包括父類中定義的方法。如果我們只想對(duì)Greeter類的方法進(jìn)行列表的話,那么把false作為參數(shù)調(diào)用 instance_methods方法即可。false意味著我們不需要父類定義的方法。

          image

          哈哈,這才是我們想要的。下面讓我們看看Greeter對(duì)象能回應(yīng)哪些方法:

          image

          它知道say_hi、to_s(此方法將對(duì)象轉(zhuǎn)換為字符串,是任何對(duì)象都必備的默認(rèn)方法,很想Java中的toString方法),但它不知道name。

          隨時(shí)修改類定義

          如何才能查看或者修改name呢?Ruby提供了訪問對(duì)象變量的簡(jiǎn)單方法:

          image

          在Ruby語言中,你能夠多次打開某個(gè)類并修改它。而修改所帶來的變化將應(yīng)用在此后建立的任何新對(duì)象中、甚至現(xiàn)存的此類對(duì)象中。下面讓我們建立一個(gè)新對(duì)象并訪問它的@name屬性。

          image

          我們通過使用attr_accessor定義了兩個(gè)方法:

          “.name”用來獲取name屬性值;

          “.name=”用來設(shè)置namee屬性值。

          這很類似在Java類中訪問被Public修飾的成員變量。



          向每個(gè)人問候,MegaGreeter不會(huì)漏掉一個(gè)人

          Greeter并不完美,因?yàn)樗荒芤淮畏?wù)一個(gè)人。所以我們?cè)谶@里設(shè)計(jì)一個(gè)能夠一次向全世界、世界上每個(gè)人或者在名單中的人發(fā)送問候的MegaGreeter類。在這里,我們將放棄從前的IRB交互模式,轉(zhuǎn)而改為編寫Ruby程序文件。

          退出IRB的方法:輸入“quit”、“exit”或者按下Control+D的組合鍵。

          image

          保存上面的代碼到名為“ri20min.rb”的文件中,并使用“ruby ri20min.rb”的命令執(zhí)行它。程序輸出如下:

          image

          下面我們將深入了解一下上面的代碼。

          請(qǐng)注意上面代碼中的起始行,它以#開頭。在Ruby語言中,任何以#開頭的行都被視為注釋,并被解釋程序忽略。

          我們的say_hi方法已經(jīng)發(fā)生了變化:

          image

          它查找@names參數(shù)并按照其參數(shù)值作出決定:

          如果參數(shù)值為nil,它將打印三個(gè)圓點(diǎn)。

          那么@names.respond_to?("each")表示什么?

          循環(huán)——也叫迭代

          如果@names對(duì)象具有each方法,那么它是可以被迭代的,進(jìn)而可以對(duì)其進(jìn)行迭代,從而問候列表中每個(gè)人。如果@names不具備each方法,則將它自動(dòng)轉(zhuǎn)換為字符串,并執(zhí)行默認(rèn)的問候。

          image

          each是一種方法,它接受一個(gè)代碼塊(block of code),然后針對(duì)列表中的每個(gè)成員執(zhí)行這個(gè)代碼塊,而在do和end之間的部分便是這個(gè)非常類似匿名函數(shù)的代碼塊。在管道符之間的變量是代碼塊的參數(shù) name,它作為代碼塊參數(shù)被綁定為列表成員,而代碼塊puts "Hello #{name}!"將使用這個(gè)參數(shù)進(jìn)行輸出。

          大多數(shù)其它的編程語言使用循環(huán)遍歷列表,下面是C語言的循環(huán)示例:

          image

          上面的代碼顯然可以工作,但它不夠“優(yōu)雅”!你不得不用i這個(gè)多余的循環(huán)變量,還需要指出列表的長(zhǎng)度,然后再解釋如何遍歷列表。

          Ruby的迭代方式則更加優(yōu)雅,所有的內(nèi)部管理細(xì)節(jié)都隱藏在each方法中,你所需做的就是告訴它如何處理其中的每個(gè)成員。

          塊(block),Ruby邊緣的高亮點(diǎn)!

          塊(block)的真正優(yōu)勢(shì)在于:能夠處理比列表更加復(fù)雜的對(duì)象。除了在方法中可以處理簡(jiǎn)單的內(nèi)部管理細(xì)節(jié)外,你還能處理setup、teardown和所有錯(cuò)誤,而不讓用戶有所察覺。

          image

          say_bye方法沒有使用each,而是檢查@names是否具有join方法,如果具有join方法,則調(diào)用join方法。否則它將直接打印@names變量。

          此方法并不關(guān)心變量的實(shí)際類型,這依賴于它所支持的那些被稱為“Duck Typing” 的方法:duck typing是動(dòng)態(tài)類型的一種形式:變量的值自身隱含地決定了了變量的行為。這暗示了某個(gè)對(duì)象與其它實(shí)現(xiàn)了相同接口的對(duì)象之間是可交換的,不管對(duì)象之間是 否具有繼承關(guān)系。鴨子測(cè)試(duck test)是對(duì)duck typing的一種形象比喻——“如果它走路像鴨子,那么也一定像鴨子一樣呷呷地叫,那么它必定是一只鴨子”。duck typing是某些編程語言的特性:如Smalltalk, Python, Ruby, ColdFusion。

          Duck Typing的益處是無需對(duì)變量的類型進(jìn)行嚴(yán)格地限制,如果某人使用一種新類型的列表類,只要它實(shí)現(xiàn)了與其它列表相同語義的join方法,便可以拿來使用。

          啟動(dòng)腳本

          文件上半部分是MegaGreeter類的代碼,而后面剩下的部分則是對(duì)這些類方法的調(diào)用。而這是我們最后值得注意的一點(diǎn):

          image

          __FILE__是一個(gè)“具有魔力”的變量,它代表了當(dāng)前文件名。$0是用于啟動(dòng)程序的文件名。那么代碼“if __FILE__ == $0”便意味著檢查此文件是否為將被使用的主程序文件。這樣做可以使程序文件作為代碼庫(kù)使用,而不是可執(zhí)行代碼;但當(dāng)此文件被用作執(zhí)行文件時(shí),也可被執(zhí) 行。

          如何進(jìn)一步學(xué)習(xí)Ruby

          到此便是本入門的尾聲了。當(dāng)然還有許多值得瀏覽的:Ruby提供的各種不同的控制結(jié)構(gòu);塊和yield的使用;模塊作為mixins使用等。希望這次Ruby初體驗(yàn)?zāi)苁鼓銓?duì)Ruby更感興趣。

          注:mixin在面向?qū)ο缶幊陶Z言中是一種提供某些功能給子類繼承的類,但mixin并不能實(shí)例化。從某個(gè) mixin繼承并不是什么特殊的形式,而它更適于收集功能。某個(gè)子類甚至可以通過繼承一個(gè)或者多個(gè)mixin選擇繼承它的全部或者多數(shù)功能。一個(gè) mixin能延期定義和綁定方法直到運(yùn)行時(shí),而屬性和實(shí)例參數(shù)也將在編譯時(shí)才被定義。這不同于多數(shù)常見的方式:定義所有的屬性、方法,并在編譯時(shí)進(jìn)行初始 化。

          posted on 2012-04-05 17:52 順其自然EVO 閱讀(1957) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2012年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 奉节县| 广河县| 抚顺县| 乌审旗| 长宁县| 行唐县| 大英县| 车致| 和龙市| 浦东新区| 长宁县| 高陵县| 稷山县| 高淳县| 北安市| 光泽县| 杭锦后旗| 西乌珠穆沁旗| 肇州县| 环江| 四川省| 东乡县| 专栏| 梓潼县| 丰镇市| 沙洋县| 白城市| 长寿区| 大石桥市| 钦州市| 柯坪县| 磴口县| 平远县| 都兰县| 安国市| 右玉县| 宜春市| 庆云县| 巴塘县| 游戏| 天峻县|