文字¶ ↑
文字建立你可以在程式中使用的物件。文字包括
布林和 Nil 文字¶ ↑
nil
和 false
都是假值。nil
有時用來表示「沒有值」或「未知」,但在條件式中會評估為 false
。
true
是真值。除了 nil
和 false
之外的所有物件在條件式中都會評估為真值。
數字文字¶ ↑
整數文字¶ ↑
你可以寫入任何大小的整數,如下所示
1234 1_234
這些數字具有相同的數值,1,234。底線可用於增強人類的可讀性。你可以在數字中的任何位置放置底線。
你可以使用特殊的前綴來寫入十進位、十六進位、八進位或二進位格式的數字。對於十進位數字,使用前綴 0d
,對於十六進位數字,使用前綴 0x
,對於八進位數字,使用前綴 0
或 0o
,對於二進位數字,使用前綴 0b
。數字的字母部分不區分大小寫。
範例
0d170 0D170 0xaa 0xAa 0xAA 0Xaa 0XAa 0XaA 0252 0o252 0O252 0b10101010 0B10101010
所有這些數字都具有相同的十進位值,170。像整數和小數一樣,你可以使用底線來提高可讀性。
浮點文字¶ ↑
浮點數可以寫成如下所示
12.34 1234e-2 1.234E1
這些數字具有相同的數值,12.34。你也可以在浮點數中使用底線。
有理數文字¶ ↑
你可以使用特殊字尾 'r'
來寫入 Rational
文字。
範例
1r # => (1/1) 2/3r # => (2/3) # With denominator. -1r # => (-1/1) # With signs. -2/3r # => (-2/3) 2/-3r # => (-2/3) -2/-3r # => (2/3) +1/+3r # => (1/3) 1.2r # => (6/5) # With fractional part. 1_1/2_1r # => (11/21) # With embedded underscores. 2/4r # => (1/2) # Automatically reduced.
語法
<rational-literal> = <numerator> [ '/' <denominator> ] 'r' <numerator> = [ <sign> ] <digits> [ <fractional-part> ] <fractional-part> = '.' <digits> <denominator> = [ sign ] <digits> <sign> = '-' | '+' <digits> = <digit> { <digit> | '_' <digit> } <digit> = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
請注意,這會被解析為浮點分子 1.2
除以有理數分母 3r
,結果為浮點數
1.2/3r # => 0.39999999999999997
複數文字¶ ↑
你可以寫入 Complex
數字,如下所示(字尾 i
)
1i #=> (0+1i) 1i * 1i #=> (-1+0i)
有理數也可能是虛數。
12.3ri #=> (0+(123/10)*i)
i
必須放在 r
之後;相反的寫法是不允許的。
12.3ir #=> Syntax error
字串¶ ↑
字串字面值¶ ↑
撰寫字串最常見的方式是使用 "
"This is a string."
字串可以是多行。
任何內部的 "
都必須跳脫。
"This string has a quote: \". As you can see, it is escaped"
雙引號字串允許跳脫字元,例如換行符號的 \n
、跳格的 \t
等。支援的跳脫序列完整清單如下
\a bell, ASCII 07h (BEL) \b backspace, ASCII 08h (BS) \t horizontal tab, ASCII 09h (TAB) \n newline (line feed), ASCII 0Ah (LF) \v vertical tab, ASCII 0Bh (VT) \f form feed, ASCII 0Ch (FF) \r carriage return, ASCII 0Dh (CR) \e escape, ASCII 1Bh (ESC) \s space, ASCII 20h (SPC) \\ backslash, \ \nnn octal bit pattern, where nnn is 1-3 octal digits ([0-7]) \xnn hexadecimal bit pattern, where nn is 1-2 hexadecimal digits ([0-9a-fA-F]) \unnnn Unicode character, where nnnn is exactly 4 hexadecimal digits ([0-9a-fA-F]) \u{nnnn ...} Unicode character(s), where each nnnn is 1-6 hexadecimal digits ([0-9a-fA-F]) \cx or \C-x control character, where x is an ASCII printable character \M-x meta character, where x is an ASCII printable character \M-\C-x meta control character, where x is an ASCII printable character \M-\cx same as above \c\M-x same as above \c? or \C-? delete, ASCII 7Fh (DEL)
反斜線後面的任何其他字元都會解釋為字元本身。
雙引號字串允許使用 #{...}
內插其他值。
"One plus one is two: #{1 + 1}"
任何表達式都可以放在內插區段中,但最好保持表達式簡短以提高可讀性。
你也可以使用 #@foo
、#@@foo
和 #$foo
分別作為 #{ @foo }
、#{ @@foo }
和 #{ $foo }
的簡寫。
可以透過跳脫「#」字元或使用單引號字串來停用內插。
'#{1 + 1}' #=> "\#{1 + 1}"
除了停用內插之外,單引號字串也會停用所有跳脫序列,除了單引號 (\'
) 和反斜線 (\\
)。
相鄰的字串字面值會自動由解釋器串接。
"con" "cat" "en" "at" "ion" #=> "concatenation" "This string contains "\ "no newlines." #=> "This string contains no newlines."
只要百分比字串不是最後一個,任何相鄰的單引號、雙引號、百分比字串的組合都會被串接。
%q{a} 'b' "c" #=> "abc" "a" 'b' %q{c} #=> NameError: uninitialized constant q
還有一個字元字面值表示法來表示單字元字串,其語法是一個問號 (?
),後面跟著一個單字元或跳脫序列,對應於腳本編碼中的單一碼點
?a #=> "a" ?abc #=> SyntaxError ?\n #=> "\n" ?\s #=> " " ?\\ #=> "\\" ?\u{41} #=> "A" ?\C-a #=> "\x01" ?\M-a #=> "\xE1" ?\M-\C-a #=> "\x81" ?\C-\M-a #=> "\x81", same as above ?あ #=> "あ"
另請參閱
Here Document 字面值¶ ↑
如果你要撰寫一大段文字,可以使用「here document」或「heredoc」
expected_result = <<HEREDOC This would contain specially formatted text. That might span many lines HEREDOC
heredoc 從 <<HEREDOC
後面的那一行開始,並以下一行開頭為 HEREDOC
的那一行結束。結果包含結尾換行符號。
你可以對 heredoc 使用任何識別碼,但通常會使用全大寫的識別碼。
如果你在 <<
後面加上「-」,你可以縮排結尾識別碼
expected_result = <<-INDENTED_HEREDOC This would contain specially formatted text. That might span many lines INDENTED_HEREDOC
請注意,雖然結尾識別碼可以縮排,但內容總是會被視為左對齊。如果你縮排內容,這些空格將會出現在輸出中。
要縮排內容和縮排結尾識別碼,可以使用「波浪形」heredoc,它在 <<
後面使用「~」而不是「-」
expected_result = <<~SQUIGGLY_HEREDOC This would contain specially formatted text. That might span many lines SQUIGGLY_HEREDOC
縮排最少縮排行的縮排會從內容的每一行中移除。請注意,空行和僅包含文字標籤和空格的行將被忽略,以用於確定縮排,但跳脫的標籤和空格被視為非縮排字元。
為了測量縮排,一個水平定位標籤被視為一個包含一到八個空格的序列,其對應的欄位位置是八的倍數。要移除的數量以空格數計算。如果邊界出現在定位標籤中間,則不會移除該定位標籤。
Heredoc 允許內插和跳脫字元。你可以透過單引號包圍開啟識別碼來停用內插和跳脫
expected_result = <<-'EXPECTED' One plus one is #{1 + 1} EXPECTED p expected_result # prints: "One plus one is \#{1 + 1}\n"
識別碼也可以用雙引號(與沒有引號相同)或反引號包圍。當用反引號包圍時,HEREDOC 會像 Kernel#`
一樣運作
puts <<-`HEREDOC` cat #{__FILE__} HEREDOC
當用引號包圍時,任何字元(除了該引號和換行符號(CR 和/或 LF))都可以用作識別碼。
要在 heredoc 上呼叫方法,請將其放在開啟識別碼之後
expected_result = <<-EXPECTED.chomp One plus one is #{1 + 1} EXPECTED
你可以在同一行開啟多個 heredoc,但這可能難以閱讀
puts(<<-ONE, <<-TWO) content for heredoc one ONE content for heredoc two TWO
符號文字¶ ↑
一個 Symbol
表示 Ruby 解譯器內的某個名稱。請參閱 Symbol
以進一步了解符號是什麼以及 Ruby 在內部建立符號的時間。
你可以使用冒號來參考符號::my_symbol
。
你也可以透過內插來建立符號
:"my_symbol1" :"my_symbol#{1 + 1}"
與字串一樣,單引號可以用來停用內插
:'my_symbol#{1 + 1}' #=> :"my_symbol\#{1 + 1}"
在建立 Hash
時,還有一個特殊語法可以參考 Symbol
。
另請參閱
陣列文字¶ ↑
陣列是使用 [
和 ]
之間的物件建立的
[1, 2, 3]
你可以在陣列中放置表達式
[1, 1 + 1, 1 + 2] [1, [1 + 1, [1 + 2]]]
另請參閱
請參閱 Array
以了解你可以對陣列使用的各種方法。
雜湊文字¶ ↑
雜湊是使用 {
和 }
之間的鍵值對建立的
{ "a" => 1, "b" => 2 }
鍵和值都可以是任何物件。
你可以使用以下語法建立具有符號鍵的雜湊
{ a: 1, b: 2 }
此語法也用於方法的關鍵字參數。
與 Symbol
文字一樣,你可以引用符號鍵。
{ "a 1": 1, "b #{1 + 1}": 2 }
等於
{ :"a 1" => 1, :"b 2" => 2 }
Hash
值可以省略,表示該值將透過鍵的名稱從內容中擷取
x = 100 y = 200 h = { x:, y: } #=> {:x=>100, :y=>200}
請參閱 Hash
,以了解您可以在雜湊中使用的函式。
範圍文字¶ ↑
範圍表示值的一個區間。範圍可以包含或排除其結束值。
(1..2) # includes its ending value (1...2) # excludes its ending value (1..) # endless range, representing infinite sequence from 1 to Infinity (..1) # beginless range, representing infinite sequence from -Infinity to 1
您可以建立任何物件的範圍。請參閱 Range
文件,以取得您需要實作的函式詳細資訊。
正規表示式文字¶ ↑
可以使用前導和尾隨斜線 ('/'
) 字元建立正規表示式
re = /foo/ # => /foo/ re.class # => Regexp
尾隨斜線後面可以接續一個或多個設定正規表示式模式的修改字元。請參閱 正規表示式模式,以取得詳細資訊。
可以在正規表示式中使用內插,以及跳脫字元。請注意,正規表示式可能需要比字串更多的跳脫字元。
另請參閱
請參閱 Regexp
,以取得正規表示式語法的說明。
Lambda Proc
文字¶ ↑
可以使用 ->
建立 lambda 程序。
-> { 1 + 1 }
呼叫上述程序會產生 2
的結果。
您可以如下要求程序的引數
->(v) { 1 + v }
這個程序會將一加到其引數。
百分比文字¶ ↑
本節中描述的每個文字都可以使用這些成對的分隔符號
-
[
和]
。 -
(
和)
。 -
{
和}
。 -
<
和>
。 -
任何其他字元,作為開始和結束分隔符號。
這些會在下一節中示範。
%q
:不可內插的 String
文字¶ ↑
您可以使用 %q
寫入不可內插的字串。建立的字串與使用單引號建立的字串相同
%[foo bar baz] # => "foo bar baz" # Using []. %(foo bar baz) # => "foo bar baz" # Using (). %{foo bar baz} # => "foo bar baz" # Using {}. %<foo bar baz> # => "foo bar baz" # Using <>. %|foo bar baz| # => "foo bar baz" # Using two |. %:foo bar baz: # => "foo bar baz" # Using two :. %q(1 + 1 is #{1 + 1}) # => "1 + 1 is \#{1 + 1}" # No interpolation.
% 和 %Q
:可內插的 String
文字¶ ↑
您可以使用 %Q
或其別名 %
寫入可內插的字串
%[foo bar baz] # => "foo bar baz" %(1 + 1 is #{1 + 1}) # => "1 + 1 is 2" # Interpolation.
%w 和 %W
:字串陣列文字¶ ↑
您可以使用 %w
(不可內插)或 %W
(可內插)寫入字串陣列
%w[foo bar baz] # => ["foo", "bar", "baz"] %w[1 % *] # => ["1", "%", "*"] # Use backslash to embed spaces in the strings. %w[foo\ bar baz\ bat] # => ["foo bar", "baz bat"] %w(#{1 + 1}) # => ["\#{1", "+", "1}"] %W(#{1 + 1}) # => ["2"]
%i 和 %I
:符號陣列字面值¶ ↑
您可以使用 %i
(不可內插)或 %I
(可內插)撰寫符號陣列
%i[foo bar baz] # => [:foo, :bar, :baz] %i[1 % *] # => [:"1", :%, :*] # Use backslash to embed spaces in the symbols. %i[foo\ bar baz\ bat] # => [:"foo bar", :"baz bat"] %i(#{1 + 1}) # => [:"\#{1", :+, :"1}"] %I(#{1 + 1}) # => [:"2"]
%s
:Symbol
字面值¶ ↑
您可以使用 %s
撰寫符號
%s[foo] # => :foo %s[foo bar] # => :"foo bar"
%r
:Regexp
字面值¶ ↑
您可以使用 %r
撰寫正規表示式;用作開頭和結尾分隔符號的字元可以是(幾乎)任何字元
%r/foo/ # => /foo/ %r:name/value pair: # => /name\/value pair/
幾對「對稱」字元可以當作分隔符號使用
%r[foo] # => /foo/ %r{foo} # => /foo/ %r(foo) # => /foo/ %r<foo> # => /foo/
結尾分隔符號後面可以接一個或多個修改符號字元,用來設定正規表示式的模式。詳情請參閱 Regexp 模式。
%x
:反引號字面值¶ ↑
您可以使用 %x
撰寫並執行 shell 指令
%x(echo 1) # => "1\n"