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