字面量

字面量创建了您可以在程序中使用的对象。字面量包括

布尔值和 Nil 字面量

nilfalse 都是假值。nil 有时用于表示“无值”或“未知”,但在条件表达式中计算为 false

true 是一个真值。除了 nilfalse 之外的所有对象在条件表达式中都计算为真值。

数字字面量

整数字面量

您可以按如下方式编写任意大小的整数

1234
1_234

这些数字的值相同,为 1,234。下划线可用于增强人类的可读性。您可以在数字中的任何位置放置下划线。

您可以使用特殊前缀以十进制、十六进制、八进制或二进制格式编写数字。对于十进制数,使用 0d 前缀;对于十六进制数,使用 0x 前缀;对于八进制数,使用 00o 前缀;对于二进制数,使用 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 解释器中的一个名称。有关符号是什么以及 ruby 何时在内部创建符号的更多详细信息,请参阅 Symbol

您可以使用冒号引用符号::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 proc。

-> { 1 + 1 }

调用上面的 proc 将得到结果 2

您可以为 proc 指定参数,如下所示

->(v) { 1 + v }

此 proc 将为其参数加一。

百分号字面量

本节中描述的每个字面量都可以使用以下配对分隔符

这些将在下一节中演示。

%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"]

%sSymbol 字面量

您可以使用 `%s` 编写符号。

:foo     # => :foo
:foo bar # => :"foo bar"

%rRegexp 字面量

您可以使用 `%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"