?
This document uses PHP Chinese website manual Release
我們把形如數(shù)字1或字符串“hello world”這樣可以直接寫(xiě)入Ruby程序中的值叫做字面值。
123
0d123
ruby 1.7 特性
整數(shù)
-123
有符號(hào)整數(shù) trap::Numeric
123.45
浮點(diǎn)數(shù) ruby 1.8 特性: 不能把0.1寫(xiě)成".1",而只能完整地寫(xiě)為0.1。
1.2e-3
浮點(diǎn)數(shù)
0xffff
16進(jìn)制整數(shù)
0b1011
2進(jìn)制整數(shù)
0377
0o377
ruby 1.7 特性
8進(jìn)制整數(shù)
?a
字符a
的代碼(97)
ruby 1.7 特性: 用在空白類(lèi)字符上時(shí),必須寫(xiě)成這樣,?\s、?\t等。
?\C-a
Control a 的代碼(1)
?\M-a
Meta a 的代碼(225)
?\M-\C-a
Meta-Control a 的代碼(129)
在?
句中,所有的反斜線(xiàn)表示法都是有效的。
您可以在除了字符代碼以外的數(shù)值字面值中插入“_”。Ruby解釋器會(huì)忽視“_”而不作處理。當(dāng)數(shù)值位數(shù)非常多時(shí),使用“_”會(huì)讓您快速看清其位數(shù)。但是不能在字面值的前面或后面插入“_”(若在字面值前面(包括(+,-)號(hào)與字面值間的位置)插入_時(shí),它會(huì)被誤認(rèn)成局部變量或方法調(diào)用)。
1_000_000_000 => 1000000000 0xffff_ffff => 0xffffffff
例:
"this is a string expression\n" 'this is a string expression\n' %q!I said, "You said, 'She said it.'"! %!I said, "You said, 'She said it.'"! %Q('This is it.'\n)
字符串被雙引號(hào)或單引號(hào)包圍著。在被雙引號(hào)中括起來(lái)的字符串中,反斜線(xiàn)表示法和展開(kāi)式(后面詳述)都是有效的。在被單引號(hào)括起來(lái)的字符串中,除了\\(反斜線(xiàn)本身)、\'(單引號(hào))和行尾的\(忽略換行)以外,不會(huì)對(duì)字符串內(nèi)容作任何處理。
中間留有空白的字符串在編譯時(shí)會(huì)被當(dāng)作1個(gè)字符串字面值來(lái)處理。
p "foo" "bar" => "foobar"
還有其他一些使用%表示法的字符串項(xiàng)目。
每次對(duì)字符串表達(dá)式進(jìn)行計(jì)算時(shí)都會(huì)生成新的字符串對(duì)象。
\t
Tab(0x09)
\n
換行(0x0a)
\r
回車(chē)(0x0d)
\f
換頁(yè)(0x0c)
\b
BackSpace(0x08)
\a
Bell (0x07)
\e
Escape(0x1b)
\s
空白(0x20)
\nnn
8 進(jìn)制數(shù)表示 (n 為 0-7)
\xnn
16 進(jìn)制數(shù)表示 (n 為 0-9,a-f)
\cx
\C-x
Control字符 (x 為 ASCII 字符)
\M-x
Meta x (c | 0x80)
\M-\C-x
Meta Control x
\x
字符 x 本身
例:
(假設(shè)$ruby = "RUBY") "my name is #{$ruby}" #=> "my name is RUBY" 'my name is #{$ruby}' #=> "my name is #{$ruby}"
在以雙引號(hào)("
)括起來(lái)的字符串表達(dá)式、命令字符串以及正則表達(dá)式中,可以使用“#{表達(dá)式}”把表達(dá)式的內(nèi)容(以字符串的形式)嵌入其中。若表達(dá)式是以($,@)開(kāi)始的變量的話(huà),則可以省略{}部分,只使用“#變量名”的形式即可。如果在字符#后出現(xiàn)的是“{,$,@”以外的其他字符的話(huà),字符#仍代表"#"本身。若想顯式地阻止展開(kāi)式的話(huà),在#前添加反斜線(xiàn)即可。
展開(kāi)式中可以包括雙引號(hào)和其他的Ruby表達(dá)式。注釋也可以納入其中。
p "#{ "string" # comment }" # => "string"
ruby 1.7 特性: 在version 1.7中,展開(kāi)式中的注釋內(nèi)容開(kāi)始于“#”終止在行尾,而非“}”。因此,上例應(yīng)該寫(xiě)成
p "#{ "string" # comment }" # => "string"
這個(gè)樣子。
例:
`date` %x{ date }
被后引號(hào)(`
)括起來(lái)的字符串與被雙引號(hào)括起來(lái)的字符串是一樣的。首先會(huì)處理其中的反斜線(xiàn)表示法和展開(kāi)式,然后才會(huì)執(zhí)行該命令。命令的標(biāo)準(zhǔn)輸出是字符串。每次計(jì)算命令時(shí)都會(huì)把它執(zhí)行一次。若想得到命令的結(jié)束status,請(qǐng)參考$?。
還有其他一些使用%表示法的命令輸出。
語(yǔ)法:
<<[-]["'`]標(biāo)識(shí)符["'`] ... 標(biāo)識(shí)符
普通的字符串字面值是指使用分隔符(", ', ` 等)括起來(lái)的字符串部分。集成字符串是指,把從包含“<<標(biāo)識(shí)符”的行的下一行開(kāi)始,到只包含“標(biāo)識(shí)符”的行的行首之間的內(nèi)容封裝起來(lái)之后得到的多行字符串(的字面值)。例如
print <<EOS # (從這里開(kāi)始)直到標(biāo)識(shí)符 EOS 之前的部分就是字面值 the string next line EOS
等同于下例
print " the string\n next line\n"
集成字符串中的開(kāi)始標(biāo)簽“<<標(biāo)識(shí)符”具有非常重要的語(yǔ)法意義。您可以使用開(kāi)始標(biāo)簽,將集成字符串的內(nèi)容傳遞給某參數(shù),或者把集成字符串本身當(dāng)作被調(diào)(receiver)使用。
# 在表達(dá)式中加入開(kāi)始標(biāo)簽 # 把集成字符串的內(nèi)容傳遞給method的第2個(gè)參數(shù) method(arg1, <<LABEL, arg2) 集成字符串的具體內(nèi)容 LABEL # 將集成字符串用作被調(diào) p <<LABEL.upcase the lower case string LABEL # => "THE LOWER CASE STRING"
開(kāi)始標(biāo)簽的下一行通常是集成字符串的具體內(nèi)容。例如,下面的寫(xiě)法是錯(cuò)誤的。
printf('%s%d', <<EOS, 3055 * 2 / 5) # <- 該行已經(jīng)混入集成字符串的內(nèi)部 This line is a here document. EOS
若把開(kāi)始標(biāo)簽寫(xiě)成“<<-標(biāo)識(shí)符”的話(huà),表示集成字符串的最后一行將使用縮進(jìn)格式。除此以外,您不能在最后一行中加入空白或是注釋。
if need_define_foo eval <<-EOS # 使用'<<-'后 def foo print "foo\n" end EOS #↑最后一行使用了縮進(jìn)格式。 end
您還可以在同一行中使用多個(gè)集成字符串。
print <<FIRST, <<SECOND 這里是第一個(gè)集成字符串的內(nèi)容。 這里也是。 FIRST 從該行開(kāi)始第二個(gè)集成字符串的內(nèi)容。 第二個(gè)集成字符串將在本行后面結(jié)束。 SECOND
您可以使用引號(hào)(""、''或``)將開(kāi)始標(biāo)簽“<<標(biāo)識(shí)符”中的標(biāo)識(shí)符括起來(lái)。這時(shí),集成字符串的性質(zhì)將取決于您所選擇的引號(hào)的種類(lèi)。請(qǐng)參考下列,當(dāng)您選擇雙引號(hào)時(shí),其效果與不使用任何引號(hào)時(shí)的效果相同。
# 反斜線(xiàn)表示法和展開(kāi)式都是有效的 print <<"EOS" The price is #{$price}. EOS # 效果同上 print <<EOS The price is #{$price}. EOS # 展開(kāi)式無(wú)法工作 print <<'EOS' The price is #{$price}. EOS # 執(zhí)行命令 print <<`EOC` date diff test.c.org test.c EOC
請(qǐng)參考 字符串字面值、 展開(kāi)式、 反斜線(xiàn)表示法、 命令輸出 來(lái)了解字符串字面值的性質(zhì)
例:
/^Ruby the OOPL/ /Ruby/i /my name is #{myname}/o %r|Ruby|
被/括起來(lái)的部分就是正則表達(dá)式。關(guān)于正則表達(dá)式中元字符的用法問(wèn)題,請(qǐng)參考正則表達(dá)式。
尾部/后面的字符是正則表達(dá)式中使用的選項(xiàng)。具體內(nèi)容如下。
i
匹配時(shí)不區(qū)分字母大小寫(xiě)
o
開(kāi)始計(jì)算正則表達(dá)式時(shí)只處理一次展開(kāi)式
x
正則表達(dá)式中的空白(包括換行)將被忽視。同時(shí),從"#"到行尾的部分將被當(dāng)作注釋處理(請(qǐng)注意,若注釋中包含/則會(huì)引起語(yǔ)法解析錯(cuò)誤)。
/foo # 注釋 bar/x
等同于 /foobar/
。
若想包含空白,可以像\一樣使用轉(zhuǎn)義。
m
多行模式。正則表達(dá)式 "."將會(huì)匹配換行。
因?yàn)镽uby的日語(yǔ)化做得比較好,您可以設(shè)定$KCODE使其能夠正確處理日語(yǔ)字符。若$KCODE =“n”時(shí),Ruby將不會(huì)識(shí)別任何日語(yǔ)字符,而把它們當(dāng)作字節(jié)串處理,這是默認(rèn)狀態(tài)。
您還可以擺脫$KCODE的束縛,分別為每個(gè)正則表達(dá)式指定n
, e
, s
, u
中的任意一個(gè)選項(xiàng)來(lái)確定該正則表達(dá)式的字符代碼。
您還可以使用%表示法來(lái)指定其他形式的正則表達(dá)式。
在正則表達(dá)式中,反斜線(xiàn)表示法和 展開(kāi)式也是有效的。
若正則表達(dá)式字面值中不含展開(kāi)式的話(huà),則對(duì)其進(jìn)行計(jì)算時(shí)始終返回同一個(gè)正則表達(dá)式對(duì)象。若含有展開(kāi)式的話(huà),則每次(以展開(kāi)式的結(jié)果為基礎(chǔ))進(jìn)行計(jì)算時(shí)都會(huì)編譯正則表達(dá)式并生成正則表達(dá)式對(duì)象(但是,若指定了上述的o選項(xiàng)的話(huà),則返回同一個(gè)正則表達(dá)式對(duì)象)。
例:
[1, 2, 3] %w(a b c) %W(a b c) ((<ruby 1.7 特性>))
語(yǔ)法:
`[' 表達(dá)式`,' ... `]'
分別計(jì)算每個(gè)表達(dá)式的值,然后返回由這些值構(gòu)成的數(shù)組。數(shù)組是Array類(lèi)的實(shí)例。
當(dāng)數(shù)組元素都是字符串字面值時(shí),可以使用%表示法將數(shù)組寫(xiě)成其他形式。
每次對(duì)數(shù)組表達(dá)式進(jìn)行計(jì)算時(shí)都會(huì)返回一個(gè)新的數(shù)組對(duì)象。
例:
{1=>2, 2=>4, 3=>6}
語(yǔ)法:
`{' 表達(dá)式 `=>' 表達(dá)式 `,' ... `}' `{' 表達(dá)式 `,' 表達(dá)式 `,' ... `}'
分別計(jì)算每個(gè)表達(dá)式的值,然后返回由索引和值構(gòu)成的哈希表對(duì)象。所謂哈希表是指將任意對(duì)象當(dāng)作索引而構(gòu)成的數(shù)組,它是Hash類(lèi)的實(shí)例。
當(dāng)向某方法的參數(shù)尾部傳遞哈希表,且該哈希表中的元素超過(guò)1個(gè)時(shí),可以省略{,}。但是,在形如obj[...]的方法調(diào)用以及數(shù)組表達(dá)式中,當(dāng)所有元素都是哈希表時(shí),才可以省略{,}。
例:
method(1,2,3=>4) # method(1,2,{3=>4}) obj[1=>2,3=>4] # obj[{1=>2,3=>4}] [1=>2,3=>4] # [{1=>2, 3=>4}]
每次對(duì)哈希表表達(dá)式進(jìn)行計(jì)算時(shí)都會(huì)生成一個(gè)新的哈希表對(duì)象。
請(qǐng)參考范圍表達(dá)式
若范圍表達(dá)式兩端都是數(shù)值字面值時(shí),每次計(jì)算都將返回同一個(gè)對(duì)象。除此以外,每次計(jì)算時(shí)都會(huì)返回新的范圍對(duì)象。
例:
(符號(hào)的例子) :class :lvar :method! :andthisis? :$gvar :@ivar :@@cvar :+
語(yǔ)法:
`:' 標(biāo)識(shí)符 `:' 變量名 `:' 操作符
Symbol類(lèi)的實(shí)例。字符串與Symbol
對(duì)象是一一對(duì)應(yīng)的。
指定給Symbol字面值的操作符,必須是那些可以作為方法進(jìn)行再定義的操作符。請(qǐng)參考操作符表達(dá)式。
ruby 1.7 特性: 在1.7中,也可以這樣
p :'foo-bar' #=> :"foo-bar" p :"foo-bar" #=> :"foo-bar" p %s{foo-bar} #=> :"foo-bar"
在這種表示法中,可以定義任意的符號(hào)(但不能包含“\0”)。
在:"..."
中,反斜線(xiàn)表示法和 展開(kāi)式都是有效的。
通常符號(hào)是一種很專(zhuān)一的對(duì)象,計(jì)算時(shí)(就算包含展開(kāi)式也好,只要其結(jié)果是同一字符串的話(huà))總是返回同一對(duì)象。
在字符串字面值、 命令輸出、 正則表達(dá)式字面值、 數(shù)組表達(dá)式、 符號(hào) 中,可以使用這種以%開(kāi)頭的表達(dá)法。特別是當(dāng)字符串或正則表達(dá)式中包含雙引號(hào)(")、斜線(xiàn)(/)等(切分字面值時(shí)使用的字符)要素時(shí),它可以減少反斜線(xiàn)(\)在代碼中出現(xiàn)的次數(shù)。另外,它還可以方便地表示字符串?dāng)?shù)組。詳細(xì)內(nèi)容如下。
%!STRING!
: 雙引號(hào)中的字符串
%Q!STRING!
: 同上
%q!STRING!
: 單引號(hào)中的字符串
%x!STRING!
: 命令輸出
%r!STRING!
: 正則表達(dá)式
%w!STRING!
: 字符串?dāng)?shù)組(以空白字符切分各元素)
%W!STRING!
: 字符串?dāng)?shù)組(以空白字符切分各元素)。展開(kāi)式、反斜線(xiàn)表示法都有效(ruby 1.7 特性)
%s!STRING!
: 符號(hào)。展開(kāi)式、反斜線(xiàn)表示法都無(wú)效(ruby 1.7 特性) !
部分可以使用任何非字母非數(shù)字的字符,包括換行。若起始切分字符是括號(hào)("(","[","{","<")的話(huà),則終止切分字符就是與其對(duì)應(yīng)的括號(hào)。若以括號(hào)作為切分字符的話(huà),只要對(duì)應(yīng)部分使用了對(duì)應(yīng)的括號(hào),就可以在其中的元素中使用與切分字符一樣的括號(hào)。
%(()) => "()"
若在數(shù)組表達(dá)式中使用%表示法的話(huà),相當(dāng)于使用空白字符將數(shù)組中以單引號(hào)括起來(lái)的字符串元素分隔開(kāi)來(lái)。例如,
%w(foo bar baz)
與['foo', 'bar', 'baz']
是一樣。
還可以使用反斜線(xiàn)將空白字符納入數(shù)組元素。
%w(foo\ bar baz) => ["foo bar", "baz"]
ruby 1.7 特性:%W與%w相同,就如同雙引號(hào)中的字符串一樣,可以使用展開(kāi)式和反斜線(xiàn)表示法。但使用空白字符進(jìn)行切分的過(guò)程要早于展開(kāi)式的計(jì)算過(guò)程。
v = "c d" %W(a\ b #{v}e\sf #{}) => ["a b", "c de f", ""]