字面量¶ ↑
字面量创建可在程序中使用的对象。字面量包括
布尔值和 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
字符串¶ ↑
转义序列¶ ↑
某些字符可以在双引号字符串、字符字面量、Here 文档字面量(非引号、双引号和带有反引号)、双引号符号、Hash
字面量中的双引号符号键、Regexp
字面量以及几个百分号字面量(%
、%Q
、%W
、%I
、%r
、%x
)中表示为转义序列。
它们允许使用诸如 \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) \<newline> continuation line (empty string)
最后一个 <newline>
表示一个空字符串,而不是一个字符。它用于折叠字符串中的行。
双引号字符串字面量¶ ↑
编写字符串的最常见方法是使用 "
"This is a string."
该字符串可以是多行的。
任何内部的 "
都必须转义
"This string has a quote: \". As you can see, it is escaped"
双引号字符串允许使用 转义序列 中描述的转义序列。
在双引号字符串中,任何反斜杠后面的其他字符都解释为字符本身。
双引号字符串允许使用 #{...}
插值其他值
"One plus one is two: #{1 + 1}"
任何表达式都可以放在插值部分内,但为了提高可读性,最好使表达式保持较小。
您还可以使用 #@foo
、#@@foo
和 #$foo
分别作为 #{ @foo }
、#{ @@foo }
和 #{ $foo }
的简写。
另请参阅
单引号字符串字面量¶ ↑
可以通过转义“#”字符或使用单引号字符串来禁用插值
'#{1 + 1}' #=> "\#{1 + 1}"
除了禁用插值之外,单引号字符串还禁用所有转义序列,但单引号 (\'
) 和反斜杠 (\\
) 除外。
在单引号字符串中,反斜杠后面的任何其他字符都按原样解释:反斜杠和字符本身。
另请参阅
字面 String
连接¶ ↑
相邻的字符串字面量会自动由解释器连接
"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 文档字面量¶ ↑
如果您正在编写大块文本,则可以使用“here 文档”或“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,该 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 解释器内部的名称。有关符号是什么以及 ruby 何时在内部创建它们的更多详细信息,请参阅 Symbol
。
您可以使用冒号引用符号::my_symbol
。
您还可以使用双引号和 转义序列 中描述的插值和转义序列创建符号
:"my_symbol1" :"my_symbol#{1 + 1}" :"foo\sbar"
与字符串类似,可以使用单引号来禁用插值和转义序列
:'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 proc
-> { 1 + 1 }
调用上面的 proc 将得到结果 2
。
您可以按如下方式为 proc 要求参数
->(v) { 1 + v }
此 proc 将向其参数加一。
百分比字面量¶ ↑
本节中描述的每个字面量都可以使用这些配对的分隔符
-
[
和]
。 -
(
和)
。 -
{
和}
。 -
<
和>
。 -
非字母数字 ASCII 字符,除了上述字符之外,作为开始和结束分隔符。
分隔符可以使用反斜杠进行转义。但是,前四对(方括号、圆括号、大括号和尖括号)在正确配对的情况下允许不使用反斜杠。
这些将在下一节中演示。
%q
:不可插值的 String
字面量¶ ↑
您可以使用 %q
编写不可插值的字符串。创建的字符串与使用单引号创建的字符串相同
%q[foo bar baz] # => "foo bar baz" # Using []. %q(foo bar baz) # => "foo bar baz" # Using (). %q{foo bar baz} # => "foo bar baz" # Using {}. %q<foo bar baz> # => "foo bar baz" # Using <>. %q|foo bar baz| # => "foo bar baz" # Using two |. %q:foo bar baz: # => "foo bar baz" # Using two :. %q(1 + 1 is #{1 + 1}) # => "1 + 1 is \#{1 + 1}" # No interpolation. %q[foo[bar]baz] # => "foo[bar]baz" # brackets can be nested. %q(foo(bar)baz) # => "foo(bar)baz" # parenthesis can be nested. %q{foo{bar}baz} # => "foo{bar}baz" # braces can be nested. %q<foo<bar>baz> # => "foo<bar>baz" # angle brackets can be nested.
这类似于单引号字符串,但只有反斜杠和指定的分隔符可以用反斜杠转义。
% 和 %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[foo\ bar baz\ bat] # => ["foo bar", "baz bat"] %w(#{1 + 1}) # => ["\#{1", "+", "1}"] %W(#{1 + 1}) # => ["2"] # The nested delimiters evaluated to a flat array of strings # (not nested array). %w[foo[bar baz]qux] # => ["foo[bar", "baz]qux"]
以下字符被视为分隔单词的空格
-
空格,ASCII 20h (SPC)
-
换页符,ASCII 0Ch (FF)
-
换行符(换行),ASCII 0Ah (LF)
-
回车符,ASCII 0Dh (CR)
-
水平制表符,ASCII 09h (TAB)
-
垂直制表符,ASCII 0Bh (VT)
空格字符可以用反斜杠转义,使其成为单词的一部分。
%W
允许 转义序列 中描述的转义序列。但是,续行符 <newline>
不可用,因为它被解释为上面描述的转义换行符。
%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[foo\ bar baz\ bat] # => [:"foo bar", :"baz bat"] %i(#{1 + 1}) # => [:"\#{1", :+, :"1}"] %I(#{1 + 1}) # => [:"2"]
空格字符及其转义符的解释与 %w 和 %W:字符串数组字面量 中描述的字符串数组字面量相同。
%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/
尾随分隔符后可以跟一个或多个修饰符字符,用于设置正则表达式的模式。有关详细信息,请参阅正则表达式模式。
%x
:反引号字面量¶ ↑
您可以使用 %x
写入和执行 shell 命令
%x(echo 1) # => "1\n" %x[echo #{1 + 2}] # => "3\n" %x[echo \u0030] # => "0\n"
这是可插值的。%x
允许 转义序列 中描述的转义序列。