Literals
Literals
文字创建可以在程序中使用的对象。文字包括:
- Booleans and nil
- Numbers
- Strings
- Symbols
- Arrays
- Hashes
- Ranges
- Regular Expressions
- Procs
Booleans 和 nil
nil
和false
都是假值。nil
有时用于表示“无值”或“未知”,但false
在条件表达式中进行评估。
true
是一个真正的价值。除条件表达式外的所有对象,nil
和false
计算为真值。
(也有常数TRUE
,FALSE
和NIL
,但小写文字的形式是优选的。)
Numbers
您可以按如下方式编写任意大小的整数:
1234
1_234
这些数字具有相同的值,1,234。下划线可用于增强人类的可读性。你可以在数字的任何位置加下划线。
浮点数可以写成如下:
12.34
1234e-2
1.234E1
这些数字具有相同的值,12.34。你也可以在浮点数中使用下划线。
您可以使用特殊前缀以十进制,十六进制,八进制或二进制格式编写数字。对于十进制数字使用前缀0d
,对于十六进制数字使用前缀0x
,对于八进制数字使用前缀0
或0o
,对于二进制数字使用前缀0b
。数字的字母组成部分不区分大小写。
例子:
0d170
0D170
0xaa
0xAa
0xAA
0Xaa
0XAa
0XaA
0252
0o252
0O252
0b10101010
0B10101010
所有这些数字都具有相同的十进制值,170。与整数和浮点数一样,可以使用下划线来提高可读性。
Strings
编写字符串的最常用方式是使用"
:
"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}"
任何表达式都可以放在插值段中,但为了可读性最好保持表达式的小。
可以通过转义“#”字符或使用单引号字符串来禁用插值:
'#{1 + 1}' #=> "\#{1 + 1}"
除了禁用插值之外,单引号字符串还会禁用除单引号(\'
)和反斜线(\\
)之外的所有转义序列。
您也可以使用%
以下方式创建字符
%Q(1 + 1 is #{1 + 1}) #=> "1 + 1 is 2"
有两种不同类型的%
字符串的%q(...)
行为类似于单引号字符串(无插值或字符转义),而%Q
行为则是双引号字符串。有关百分比字符串的语法的更多讨论,请参阅下面的百分比字符串。
解释器会自动连接相邻的字符串文字:
"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 Documents
如果你正在写一大段文字,你可以使用 “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
请注意,虽然关闭标识符可能会缩进,但内容总是被视为向左齐平。如果缩进内容,那些空格将出现在输出中。
要有缩进的内容以及缩进的关闭标识符,可以使用 “squiggly”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
要在开放标识符之后的 heredoc 地方调用方法:
expected_result = "One plus one is #{1 + 1}
".chomp
你可以在同一行打开多个 heredocs,但这很难阅读:
puts("content for heredoc one
", "content for heredoc two
")
Symbols
符号表示 Ruby 解释器中的名称。有关符号的详细信息以及 Ruby 何时在内部创建它们的详细信息,请参阅符号。
你可以用冒号引用一个符号::my_symbol
。
您也可以通过插值创建符号:
:"my_symbol1"
:"my_symbol#{1 + 1}"
像字符串一样,可以使用单引号来禁用插值:
:'my_symbol#{1 + 1}' #=> :"my_symbol\#{1 + 1}"
创建哈希时,还有一个用于引用符号的特殊语法。
Arrays
一个阵列使用之间的对象创建[
和]
:
[1, 2, 3]
你可以在数组中放置表达式:
[1, 1 + 1, 1 + 2]
[1, [1 + 1, [1 + 2]]]
有关可能用于数组的方法,请参阅 Array。
Hashes
哈希是使用{
和之间的键值对创建的}
:
{ "a" => 1, "b" => 2 }
键和值都可以是任何对象。
您可以使用以下语法使用符号键创建哈希:
{ a: 1, b: 2 }
这个相同的语法用于方法的关键字参数。
像符号文字一样,您可以引用符号键。
{ "a 1": 1, "b #{1 + 1}": 2 }
等于
{ :"a 1" => 1, :"b 2" => 2 }
请参阅散列以了解您可能使用散列的方法。
Ranges
范围表示值的区间。范围可以包括或排除其结尾值。
(1..2) # includes its ending value
(1...2) # excludes its ending value
您可以创建任何对象的范围。有关您需要实施的方法的详细信息,请参阅范围文档。
常用表达
正则表达式使用“/”创建:
/my regular expression/
正则表达式后面可以跟随调整正则表达式匹配行为的标志。“i” 标志使正则表达式不区分大小写:
/my regular expression/i
插值可以在正则表达式中与转义字符一起使用。请注意,正则表达式可能需要比字符串更多的转义字符。
有关正则表达式语法的描述,请参阅 Regexp。
Procs
一个 proc 可以创建->:
-> { 1 + 1 }
调用上述 proc 将给出结果2
。
您可以要求 proc 的参数如下:
->(v) { 1 + v }
这个过程会为它的论点增加一个。
百分比字符串
除此之外%(...)
创建一个字符串,%
可能会创建其他类型的对象。与字符串一样,大写字母允许插值和转义字符,而小写字母则禁用它们。
这些是 ruby 中字符串百分比的类型:
%i
符号数组
%q
串
%r
正则表达式
%s
符号
%w
字符串数组
%x
反向(捕获 subshell 结果)
对于字符串百分比的两种数组形式,如果您希望在其中一个数组条目中包含空格,则必须使用“\”字符转义它。
%w[one one-hundred\ one]
#=> ["one", "one-hundred one"]
如果您正在使用“(”,“”,“{”,“<”,则必须分别用“)”,“”,“}”,“>”关闭它。您可以将大多数其他非字母数字字符用于百分比字符串分隔符,如“%”,“|”,“^”等。