<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Ruby程序設(shè)計(jì)語言快速入門(七)-------之?dāng)?shù)字、字符串和其它

    ?在Ruby中,一切都是對(duì)象。更精確地說,Ruby中的一切都是一個(gè)具有完整功能的對(duì)象。因此,在Ruby中,數(shù)字4,定點(diǎn)數(shù)3.14和字符串"Hi"都是對(duì)象。顯然,它們是有點(diǎn)"特殊"的,因?yàn)槟悴槐厥褂胣ew方法來創(chuàng)建它們。代之的是,你使用例如"literal 4"這樣的形式來創(chuàng)建一個(gè)代表數(shù)字4的對(duì)象的實(shí)例。

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

      數(shù)字類型

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


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

      Literal用來描述這些類的實(shí)例。下面的在交互式Ruby外殼(irb)中的代碼顯示了Float,F(xiàn)ixnum和Bignum的literal實(shí)例。注意,可以在literal上進(jìn)行方法調(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ù)標(biāo)志的數(shù)字。數(shù)字的前面加上0代表這是一個(gè)八進(jìn)制數(shù),加上0x代表這是一個(gè)十六進(jìn)制數(shù),而0b代表是一個(gè)二進(jìn)制數(shù)。為清晰起見,下劃線可以用作數(shù)字中的分隔符號(hào)。注意,當(dāng)寫literal時(shí),不要用逗號(hào)作為分隔符號(hào)。在一些情況中,這實(shí)際上能生成一個(gè)數(shù)組,我們將在后面討論。最后,在一個(gè)字符(或Ctrl或元字符的組合)前面的一個(gè)問號(hào)將會(huì)創(chuàng)建一個(gè)Fixnum的實(shí)例,相應(yīng)于字符的ASCII字符/逃逸序列值。

    <
    irb(main):001:0>?3.14E5?#指數(shù)標(biāo)志
    =>?314000.0
    irb(main):002:0>?054?#八進(jìn)制
    =>?44
    irb(main):003:0>?0x5A?#十六進(jìn)制
    =>?90
    irb(main):004:0>?0b1011?#二進(jìn)制
    =>?11
    irb(main):005:0>?10_000?#10,000,用下劃線隔開
    =>?10000
    irb(main):006:0>?i=10,000?#創(chuàng)建一個(gè)數(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實(shí)例間的真實(shí)差別是什么?Fixnum整數(shù)可以被存儲(chǔ)在機(jī)器中的一個(gè)字(通常16,32或64位)中,但減去1個(gè)位;而Bignum實(shí)例是超出固定存儲(chǔ)空間的整數(shù)。當(dāng)然,作為開發(fā)者,你不必?fù)?dān)心整數(shù)的大小(見下面的例子),由Ruby負(fù)責(zé)為你實(shí)現(xiàn)Fixnum和Bignum之間的自動(dòng)轉(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é)。通常,它們是一個(gè)字符序列。在Ruby中,可以使用一個(gè)literal或new方法來創(chuàng)建String類的實(shí)例。

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

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

    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"?

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

      除了使用單引號(hào)和雙引號(hào)來定義一個(gè)字符串literal外,在Ruby中,還有另外的方法可以表達(dá)literal。一個(gè)百分號(hào)和小寫或大寫字母Q可以用來表達(dá)一個(gè)字符串,分別相應(yīng)于單引號(hào)或雙引號(hào)風(fēng)格。

    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é)束。在本例中,@符號(hào)用作字符串開始與結(jié)束的限界符號(hào)。

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

    ????? 布爾類型

      最后,讓我們?cè)倏匆幌虏紶栴愋汀T赗uby中,有兩個(gè)類用于表達(dá)布爾類型:TrueClass和FalseClass。每個(gè)這些類僅有一個(gè)實(shí)例(一個(gè)singleton):也就是true和false。這些是可在Ruby的任何地方存取的全局值。還有一個(gè)類NilClass。NilClass也僅有一個(gè)實(shí)例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ī)表達(dá)式

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

    /Tiger|Phil/

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

    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"?

      下面是另一個(gè)稍微復(fù)雜些的正規(guī)表達(dá)式:

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

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

    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
    這是一個(gè)有效的電子郵件地址。
    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
    ?

      這不是一個(gè)有效的電子郵件地址

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


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

      注意,在Ruby中正規(guī)表達(dá)式也是一種對(duì)象。在下面的代碼示例中,一個(gè)正規(guī)表達(dá)式實(shí)例(派生自類Regexp)作為String方法的一個(gè)參數(shù)(gsub)以達(dá)到使用"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!"?

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

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

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

      范圍

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

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

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

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

    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ù)是范圍的一個(gè)成員。上例中,"Z"不是范圍的一個(gè)元素。這個(gè)方法還有一個(gè)與之等價(jià)的操作符"==="-它實(shí)現(xiàn)相同的功能。

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

      范圍被應(yīng)用在Ruby編程的許多方面。它們有兩種特定的使用:作為生成器(generator)和謂詞(predicate)。作為一個(gè)生成器,在范圍上的每個(gè)方法允許你遍歷該范圍中的每個(gè)元素;例如,你想確定在一個(gè)K字節(jié)范圍中的實(shí)際字節(jié)數(shù)。下面在irb中運(yùn)行的代碼使用了一個(gè)范圍作為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),通常借助于操作符===的幫助。例如,你可以使用一個(gè)范圍謂詞來測(cè)試一個(gè)相對(duì)于有效的端口號(hào)(0~65535)和保留的端口號(hào)(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é)果是,建議的端口號(hào)可以使用。

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



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

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

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊(cè)

    收藏夾

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

    友情鏈接

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

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲jjzzjjzz在线播放| 在线观看av永久免费| 亚洲aⅴ天堂av天堂无码麻豆| 久久精品国产96精品亚洲 | 亚洲精品无码永久在线观看| 99无码人妻一区二区三区免费| 两性色午夜视频免费网| 香港经典a毛片免费观看看| 亚洲av日韩av无码av| 久久夜色精品国产噜噜亚洲AV| 国产乱辈通伦影片在线播放亚洲 | 亚洲国产精品成人久久蜜臀| 国产四虎免费精品视频| 你懂的免费在线观看网站| 和老外3p爽粗大免费视频| 野花视频在线官网免费1| 亚洲AV无码成人精品区日韩| 亚洲AV日韩综合一区尤物| 亚洲国产成人精品久久| 97se亚洲综合在线| 亚洲精品午夜无码电影网| 亚洲色欲久久久久综合网| 国产在线观看免费完整版中文版| 日韩精品成人无码专区免费| 4虎永免费最新永久免费地址| 精品一区二区三区无码免费视频 | 亚洲日本中文字幕| 亚洲一区二区中文| 亚洲天天做日日做天天看| 亚洲AV本道一区二区三区四区| 国产AV无码专区亚洲A∨毛片| 亚洲女初尝黑人巨高清| 亚洲女同成av人片在线观看 | 一区二区在线免费视频| 一级视频免费观看| 两性色午夜视频免费网| 免费日本一区二区| 在线观看免费中文视频| 国产精品久久永久免费| 好男人视频社区精品免费| 日本一道在线日本一道高清不卡免费|