Ruby程序設(shè)計語言快速入門(七)-------之數(shù)字、字符串和其它

          ?在Ruby中,一切都是對象。更精確地說,Ruby中的一切都是一個具有完整功能的對象。因此,在Ruby中,數(shù)字4,定點數(shù)3.14和字符串"Hi"都是對象。顯然,它們是有點"特殊"的,因為你不必使用new方法來創(chuàng)建它們。代之的是,你使用例如"literal 4"這樣的形式來創(chuàng)建一個代表數(shù)字4的對象的實例。

            然而,對于絕大多數(shù)人來說,學習一種新的編程語言時,首先理解該語言提供的"標準"類型是非常有用的。所以,在這一節(jié),我們先探討數(shù)字類型,字符串類型,布爾類型和另外一些基本的Ruby數(shù)據(jù)類型。

            數(shù)字類型

            實質(zhì)上,Ruby中的數(shù)字被分為整數(shù)和浮點數(shù)兩大類。其中,整數(shù)又被進一步細分為"常規(guī)大小"的整數(shù)和大型整數(shù)。因為在Ruby中一切都是對象,所以整數(shù)和浮點數(shù)都是按類來定義的(見圖1)。從圖1看出,Numeric是所有數(shù)字類型的基類,F(xiàn)loat和Integer類是Numeric的子類。Fixnum和Bignum都是Integer的子類型-它們分別定義了"常規(guī)大小"的整數(shù)和大型整數(shù)。


          圖1.Ruby的數(shù)字類型類繼承圖。

            Literal用來描述這些類的實例。下面的在交互式Ruby外殼(irb)中的代碼顯示了Float,F(xiàn)ixnum和Bignum的literal實例。注意,可以在literal上進行方法調(diào)用(在此,是指類方法)。

          irb(main):001:0>?3.class
          =>?Fixnum
          irb(main):002:0>?3.4.class
          =>?Float
          irb(main):003:0>?10000000000000000000.class
          =>?Bignum?

            還有另外一些語法用來創(chuàng)建數(shù)字類型,顯示于下面的代碼列表中。字母E可以用來描述以指數(shù)標志的數(shù)字。數(shù)字的前面加上0代表這是一個八進制數(shù),加上0x代表這是一個十六進制數(shù),而0b代表是一個二進制數(shù)。為清晰起見,下劃線可以用作數(shù)字中的分隔符號。注意,當寫literal時,不要用逗號作為分隔符號。在一些情況中,這實際上能生成一個數(shù)組,我們將在后面討論。最后,在一個字符(或Ctrl或元字符的組合)前面的一個問號將會創(chuàng)建一個Fixnum的實例,相應于字符的ASCII字符/逃逸序列值。

          <
          irb(main):001:0>?3.14E5?#指數(shù)標志
          =>?314000.0
          irb(main):002:0>?054?#八進制
          =>?44
          irb(main):003:0>?0x5A?#十六進制
          =>?90
          irb(main):004:0>?0b1011?#二進制
          =>?11
          irb(main):005:0>?10_000?#10,000,用下劃線隔開
          =>?10000
          irb(main):006:0>?i=10,000?#創(chuàng)建一個數(shù)組而不是10000?Fixnum
          =>?[10,?0]
          irb(main):007:0>?i.class
          =>?Array
          irb(main):008:0>??Z?#Fixnum?ASCII值
          =>?90
          irb(main):009:0>??Z.class
          =>?Fixnum
          irb(main):010:0>??\C-s?#Control-s的值A(chǔ)SCII
          =>?19?

            Fixnum和Bignum實例間的真實差別是什么?Fixnum整數(shù)可以被存儲在機器中的一個字(通常16,32或64位)中,但減去1個位;而Bignum實例是超出固定存儲空間的整數(shù)。當然,作為開發(fā)者,你不必擔心整數(shù)的大小(見下面的例子),由Ruby負責為你實現(xiàn)Fixnum和Bignum之間的自動轉(zhuǎn)換!

          irb(main):001:0>?i=4
          =>?4
          irb(main):002:0>?i.class
          =>?Fixnum
          irb(main):003:0>?i=i+100000000000000
          =>?100000000000004
          irb(main):004:0>?i.class
          =>?Bignum
          irb(main):005:0>?i=i-100000000000000
          =>?4
          irb(main):006:0>?i.class
          =>?Fixnum

           字符串

            在Ruby中,字符串是任意順序的字節(jié)。通常,它們是一個字符序列。在Ruby中,可以使用一個literal或new方法來創(chuàng)建String類的實例。

          irb(main):001:0>?s1="Hello?World"
          =>?"Hello?World"
          irb(main):002:0>?s2=String.new("Hello?World")
          =>?"Hello?World"?

            當然,String中定義了許多方法(和操作符)。另外,可以使用單引號或雙引號來指定一個字符串。雙引號情況下允許串中加入逃逸字符并能夠嵌入待計算的表達式。在單引號串情況下,你看到的就是串中的實際內(nèi)容。為了更好的理解,請看下列例子。

          irb(main):001:0>?str1='a?\n?string'
          =>?"a?\\n?string"
          irb(main):002:0>?str2="a?\n?string"
          =>?"a?\n?string"
          irb(main):003:0>?puts?str1
          a?\n?string
          =>?nil
          irb(main):004:0>?puts?str2
          a?
          string
          =>?nil
          irb(main):005:0>?'try?to?add?#{2+2}'
          =>?"try?to?add?\#{2+2}"
          irb(main):006:0>?"try?to?add?#{2+2}"
          =>?"try?to?add?4"
          irb(main):007:0>?this="that"
          =>?"that"
          irb(main):008:0>?'when?single?quote?rights?#{this}'
          =>?"when?single?quote?rights?\#{this}"
          irb(main):009:0>?"double?quote?rights?#{this}"
          =>?"double?quote?rights?that"?

            請注意,在顯示之前,雙引號中的文本是如何被計算的,其中包括了逃逸符號(\n)和表達式(#{2+2})。

            除了使用單引號和雙引號來定義一個字符串literal外,在Ruby中,還有另外的方法可以表達literal。一個百分號和小寫或大寫字母Q可以用來表達一個字符串,分別相應于單引號或雙引號風格。

          irb(main):001:0>?%q@this?is?a?single?quote?string?#{2+2}?here@
          =>?"this?is?a?single?quote?string?\#{2+2}?here"
          irb(main):002:0>?%Q@this?is?a?double?quote?string?#{2+2}?here@
          =>?"this?is?a?double?quote?string?4?here"?

            注意,跟隨在q%或Q%后面的字符分別定義了字符串literal的開始和結(jié)束。在本例中,@符號用作字符串開始與結(jié)束的限界符號。

            還應該注意,Ruby并沒有區(qū)分一個字符串和一個字符。也就是說,沒有適用于單個字符的特定的類-它們僅是一些小的字符串。

          ????? 布爾類型

            最后,讓我們再看一下布爾類型。在Ruby中,有兩個類用于表達布爾類型:TrueClass和FalseClass。每個這些類僅有一個實例(一個singleton):也就是true和false。這些是可在Ruby的任何地方存取的全局值。還有一個類NilClass。NilClass也僅有一個實例nil-表示什么也沒有。然而,在布爾邏輯中,nil是false的同義詞。

          irb(main):001:0>?true|false
          =>?true
          irb(main):002:0>?true&false
          =>?false
          irb(main):003:0>?true|nil
          =>?true
          irb(main):004:0>?true&nil
          =>?false?

            正規(guī)表達式

            大多數(shù)程序語言中都使用正規(guī)表達式。基于許多腳本語言的Ruby也廣泛地使用正規(guī)表達式。我的一個同事曾經(jīng)說"正規(guī)表達式太復雜了。"換句話說,你需要花費一些時間來學習正規(guī)表達式。在本文中,你僅能一瞥Ruby正規(guī)表達式的威力。在程序開發(fā)中,你不必一定使用正規(guī)表達式,但是如果使用這種工具,你的編碼將更為緊湊而容易。而且,如果你想成為一名Ruby大師,你必須要花費其它時間來研究它。
          在下面的例子中,Ruby中的正規(guī)表達式是在Tiger或菲Phil之間定義的。

          /Tiger|Phil/

            現(xiàn)在你可以在一個條件或循環(huán)語句中使用帶有一個匹配操作符("=~")的正規(guī)表達式來匹配或查找其它的字符串。

          irb(main):001:0>?
          golfer="Davis"
          if?golfer?=~?/Tiger|Phil/
          puts?"This?is?going?to?be?a?long?drive."
          else
          puts?"And?now?a?drive?by?"?+?golfer
          end
          =>?"Davis"?

            下面是另一個稍微復雜些的正規(guī)表達式:

          /[\w._%-]+@[\w.-]+.[a-zA-Z]{2,4}/

            你能夠猜出這個表達式代表什么意思嗎?它相應于一個電子郵件地址。這個正規(guī)表達式可以用來校驗電子郵件地址。

          irb(main):001:0>?
          emailRE=?/[\w._%-]+@[\w.-]+.[a-zA-Z]{2,4}/
          email?=?"jwhite@interechtraining.com"
          if?email?=~?emailRE
          puts?"This?is?a?valid?email?address."
          else
          puts?"this?is?not?a?valid?email?address."
          end
          這是一個有效的電子郵件地址。
          irb(main):002:0>
          email?=?"###@spammer&&&.333"
          if?email?=~?emailRE
          puts?"This?is?a?valid?email?address."
          else
          puts?"this?is?not?a?valid?email?address."
          end
          ?

            這不是一個有效的電子郵件地址

          圖2把電子郵件正規(guī)表達式分解開來。你已看到,正規(guī)表達式語言是相當豐富的,但在此不多詳述。有關(guān)正規(guī)表達式的更多信息請參考http://www.regular-expressions.info。


          圖2.電子郵件正規(guī)表達式

            注意,在Ruby中正規(guī)表達式也是一種對象。在下面的代碼示例中,一個正規(guī)表達式實例(派生自類Regexp)作為String方法的一個參數(shù)(gsub)以達到使用"glad"來替換和"happy"與"joy"之目的。

          irb(main):001:0>?
          quote?=?"I?am?so?happy.?Happy,?happy,?joy,?joy!"
          regx?=?/(h|H)appy|joy/
          quote.gsub(regx,?"glad")
          =>?"I?am?so?happy.?Happy,?happy,?joy,?joy!"
          =>?/(h|H)appy|joy/
          =>?"I?am?so?glad.?glad,?glad,?glad,?glad!"?

            當你在正規(guī)表達式對象上使用=~操作符時,你能夠得到例如匹配模式串的索引等信息。

          irb(main):001:0>?/Tiger|Phil/=~"EyeOfTheTiger"
          =>?8?

            如果你曾編寫過大量有關(guān)字符串的程序,你就會知道Ruby中的正規(guī)表達式是非常有力量的。因此,我建議在較深入地用Ruby開發(fā)你的第一個程序前,你應該全面地探討一下Ruby中的正規(guī)表達式。當然,你可以參考本文相應的源碼文件,其中包含了大量的正規(guī)表達式。

            范圍

            在Ruby中,一個很不平常但是非常有用的概念就是范圍(range)。一個范圍是一個值序列。例如,字符a到z就可以定義在英語字母表中的所有的小寫字母。另外一個范圍的例子是整數(shù)1到10。一個范圍能從任何類型的對象中創(chuàng)建,假定對象的類型允許使用Ruby的操作符(<=>)和succ方法進行比較。根據(jù)<=>操作符左邊的操作數(shù)是否小于,等于或大于<=>操作符右邊的操作數(shù),<=>操作符將分別返回-1,0或+1。例如,"A"<=>"B"將返回-1。運行于整數(shù)4上的succ方法(4.succ)將返回5。

            可以使用Range類的new方法或特殊的標志來創(chuàng)建一個范圍。下面是在irb中分別使用括號和點速記標志創(chuàng)建的兩個相同的范圍(表示所有的大寫字母)。

          irb(main):001:0>?r1=Range.new("A","Z")
          =>?"A".."Z"
          irb(main):002:0>?r2=("A".."Z")
          =>?"A".."Z"?

            當創(chuàng)建一個范圍時,必須指定開始值和結(jié)束值。在上面的情況中,A作為開始值,Z作為結(jié)束值。當創(chuàng)建一個范圍時,你還可以指示是否這個范圍應該包括或不包括末尾元素。默認情況下,如上例所示,范圍包括末尾元素。為了排除結(jié)束元素,你可以使用new方法的排除參數(shù)(置為true)或如下所示的3個點的速記標志。

          irb(main):001:0>?r1=Range.new("A","Z",true)
          =>?"A"..."Z"
          irb(main):002:0>?r2=("A"..."Z")
          =>?"A"..."Z"
          irb(main):003:0>?r1.include?"Z"
          =>?false
          irb(main):004:0>?r2.include?"Z"
          =>?false?

            上面的示例中在范圍上調(diào)用的include?方法顯示是否其參數(shù)是范圍的一個成員。上例中,"Z"不是范圍的一個元素。這個方法還有一個與之等價的操作符"==="-它實現(xiàn)相同的功能。

          irb(main):005:0>?r2==="Z"
          =&Gt;?
          false?

            范圍被應用在Ruby編程的許多方面。它們有兩種特定的使用:作為生成器(generator)和謂詞(predicate)。作為一個生成器,在范圍上的每個方法允許你遍歷該范圍中的每個元素;例如,你想確定在一個K字節(jié)范圍中的實際字節(jié)數(shù)。下面在irb中運行的代碼使用了一個范圍作為K字節(jié)到字節(jié)的生成器。

          irb(main):008:0>?
          kilobytes=(1..10)
          kilobytes.each{|x|?puts?x*1024}
          =>?1..10
          1024
          2048
          3072
          4096
          5120
          6144
          7168
          8192
          9216
          10240
          ?

            在Ruby中,條件邏輯范圍可以被用作謂語(predicate),通常借助于操作符===的幫助。例如,你可以使用一個范圍謂詞來測試一個相對于有效的端口號(0~65535)和保留的端口號(0~1024,不包括1024)的整數(shù)參考。

          irb(main):001:0>?
          proposedPort?=?8080
          validPorts=(0..65535)
          reservedPorts=(0...1024)
          if?(validPorts?===?proposedPort)?&?!(reservedPorts?===?proposedPort)
          puts?"Proposed?port?is?ok?to?use."
          else
          puts?"Proposed?port?is?not?allowed?to?be?used."
          end
          =>?8080
          =>?0..65535
          =>?0...1024?

            上例的結(jié)果是,建議的端口號可以使用。

            另外,范圍也可以用于存取數(shù)據(jù)結(jié)構(gòu)(如數(shù)組和哈希表)中的元素。



          posted on 2006-06-19 12:15 nbt 閱讀(270) 評論(0)  編輯  收藏 所屬分類: Ruby On Railse技術(shù)

          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導航

          統(tǒng)計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          Java技術(shù)網(wǎng)站

          友情鏈接

          國內(nèi)一些開源網(wǎng)站

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 柞水县| 海门市| 滨海县| 额济纳旗| 延边| 万载县| 长顺县| 石景山区| 乌兰察布市| 老河口市| 大连市| 繁昌县| 巴东县| 马关县| 文昌市| 荔浦县| 盐津县| 噶尔县| 秭归县| 凯里市| 香格里拉县| 黄陵县| 烟台市| 稷山县| 蛟河市| 施秉县| 东乡县| 财经| 镇平县| 托克托县| 普定县| 中牟县| 和林格尔县| 儋州市| 玉田县| 建湖县| 栾川县| 开封市| 苍溪县| 崇礼县| 库伦旗|