字符串Literals
字符串對(duì)象保存有序的字節(jié)序列,通常是字符,通常形成人類(lèi)可讀文本片段。它們'是所有編程語(yǔ)言中非常常見(jiàn)的對(duì)象類(lèi)型,Ruby有許多**和低級(jí)方法來(lái)創(chuàng)建,訪(fǎng)問(wèn)和操作字符串對(duì)象。
字符串通常使用字符串文字創(chuàng)建。文字是Ruby語(yǔ)言中創(chuàng)建特定類(lèi)型對(duì)象的特殊語(yǔ)法。例如,23是創(chuàng)建Fixnum對(duì)象的文字。至于字符串literals,有幾種形式。
16單引號(hào)和雙引號(hào)字符串17 18
大多數(shù)語(yǔ)言都有類(lèi)似于此的字符串文字,所以這可能很熟悉。引號(hào)的類(lèi)型,'(單引號(hào),撇號(hào)或硬引號(hào))和"(雙引號(hào)或軟引號(hào))用于包圍字符串literals,它們之間的任何內(nèi)容都將變成字符串對(duì)象。以下示例演示了這一點(diǎn)。
但單引號(hào)和雙引號(hào)之間存在一些差異。雙引號(hào)或軟引號(hào)使一些魔術(shù)能夠在場(chǎng)外發(fā)生。最有用的是在字符串內(nèi)部插值,用于將變量的值插入字符串的中間。這是通過(guò)使用##{…}序列來(lái)實(shí)現(xiàn)的。以下示例將要求您提供姓名并歡迎您,使用插值將您的姓名插入到打印'的字符串文字中。
請(qǐng)注意,任何代碼都可以在大括號(hào)內(nèi),而不僅僅是變量名稱(chēng)。Ruby將評(píng)估該代碼,無(wú)論返回什么,它都會(huì)嘗試將其插入字符串中。所以你可以很容易地說(shuō)"你好老年人健康知識(shí)講座#{gets.chomp}",忘記name變量。但是,最好不要在大括號(hào)內(nèi)放長(zhǎng)表達(dá)式。
單引號(hào),撇號(hào)或硬引號(hào)更具限制性。罪之里面單引號(hào),Ruby除了轉(zhuǎn)義單個(gè)引號(hào)字符和反劃線(xiàn)本身(分別\'和\ \)外,不會(huì)執(zhí)行插值或逃逸序列。如果您不打算使用插值,建議多次使用單引號(hào)。
以下示例將嘗試在單引號(hào)內(nèi)插入變量。
如果你運(yùn)行這個(gè)你'不會(huì)出錯(cuò),但會(huì)打印什么?
插值序列未通過(guò)。
我什么時(shí)候應(yīng)該使用單引號(hào)和雙引號(hào)
這是一個(gè)風(fēng)格問(wèn)題。有些人一直喜歡使用雙引號(hào),除非它們變得不方便。其他人寧愿使用單引號(hào),除非插值行為是有意的。關(guān)于始終使用雙引號(hào),沒(méi)有任何固有的危險(xiǎn),但它確實(shí)使一些代碼更容易閱讀。您不需要'如果知道代碼中沒(méi)有插值,則在讀取代碼時(shí)需要讀取字符串,因?yàn)槟雷址旧頃?huì)產(chǎn)生'沒(méi)有任何副作用。所以你使用哪個(gè)字符串文字形式取決于你,這里沒(méi)有真正的對(duì)錯(cuò)方式。
逃逸序列
如果用字符串文字表示要包含引用字符,該怎么辦?例如,字符串#34;Steve said"Moo!"贏(yíng)得't工作。也不會(huì)'可以'觸摸這個(gè)!'。這兩個(gè)字符串都在字符串內(nèi)部包含引用字符,有效地結(jié)束字符串文字并導(dǎo)致語(yǔ)法錯(cuò)誤。您可以切換引用字符,如'Steve said"Moo!"',但這并不能真正解決問(wèn)題。相反,您可以逃脫字符串中的任何引用字符,它將失去其特殊含義(在這種情況下,特殊含義是關(guān)閉字符串)。
為了逃脫一個(gè)角色,用ba預(yù)先結(jié)束它c(diǎn)kslach字符。反斜杠字符告訴Ruby忽略下一個(gè)字符可能具有的任何特殊含義。如果它'是匹配的引用字符,請(qǐng)不要't結(jié)束字符串。如果它'是一個(gè)散列符號(hào),請(qǐng)開(kāi)始一個(gè)插值塊。以下示例演示了使用反斜杠來(lái)逃脫特殊字符。
反斜杠字符可用于從以下字符中刪除任何特殊含義,但令人困惑的是,它也可用于表示雙引號(hào)字符串中的特殊行為。這些特殊行為中的大多數(shù)都與插入無(wú)法直觀(guān)輸入或表示的字符和字節(jié)序列有關(guān)。并非所有字符串都是字符串,或者可能包含用于終端而不是用戶(hù)的控制序列。Ruby使您能夠使用反斜杠逃逸字符插入這些類(lèi)型的字符串。
- \ n-一個(gè)newline字符。puts方法會(huì)自動(dòng)執(zhí)行此操作,但如果要在字符串的中間插入一個(gè),或者字符串用于puts方法以外的其他內(nèi)容,則可以使用此方法在字符串中插入新行。
- \ t-制表符字符。制表符字符將光標(biāo)移動(dòng)到(在大多數(shù)終端上)到8的倍數(shù),因此這對(duì)于顯示表格數(shù)據(jù)非常有用。但是,有更好的方法可以做到這一點(diǎn),使用制表符字符被認(rèn)為有點(diǎn)古老或hackish。
- \ nnn-反斜杠后跟3個(gè)數(shù)字將表示由3個(gè)八位數(shù)字表示的ASCII字符。為什么octal?主要是出于歷史原因。
- \ xnn-反斜杠,x和2個(gè)十六進(jìn)制數(shù)字。與octal版本相同,僅具有十六進(jìn)制數(shù)字。
你可能永遠(yuǎn)不會(huì)使用其中的大部分,但知道它們存在。并且還請(qǐng)記住,它們只能用雙引號(hào)字符串表示。
下一頁(yè)討論多行字符串和字符串literals的替代語(yǔ)法。
多行字符串
大多數(shù)語(yǔ)言不允許多行字符串literals,但Ruby允許。'不需要結(jié)束字符串并為下一行附加更多字符串,Ruby使用默認(rèn)語(yǔ)法處理多行字符串literals。
替代語(yǔ)法
與大多數(shù)其他literals一樣,Ruby為字符串literals提供了另一種語(yǔ)法。例如,如果您在literals中使用了很多引用字符,則可能需要使用此語(yǔ)法。當(dāng)你使用這個(gè)語(yǔ)法是一個(gè)風(fēng)格問(wèn)題時(shí),它們通常不需要字符串。
要使用替代語(yǔ)法,請(qǐng)對(duì)單個(gè)帶引號(hào)的字符串%q{…}使用以下序列。同樣,對(duì)雙引號(hào)字符串%Q{…}使用以下語(yǔ)法。此備用語(yǔ)法遵循與其"normal"cousins相同的規(guī)則。此外,請(qǐng)注意,您可以使用任何希望的字符而不是大括號(hào)。如果使用括號(hào),方括號(hào),角括號(hào)或括號(hào),則匹配字符將以文字結(jié)尾。如果你不想使用匹配的字符,你可以使用任何其他符號(hào)(不是字母或數(shù)字)。文字將用另一個(gè)相同的符號(hào)封閉。以下示例向您展示了使用此語(yǔ)法的幾種方法。
備用語(yǔ)法也可用作多行字符串。