跳至内容

Ruby 编程/Here 文档

来自维基教科书,开放世界中的开放书籍

← 备用引号 | ASCII →


为了创建多行字符串,Ruby 支持Here 文档(Heredoc),这是一个源自Bourne shell 的特性,在PerlPHP 中也有使用。

Here 文档

[编辑 | 编辑源代码]

要构建一个 Here 文档,<< 运算符后面紧跟一个标识符,标识符标记 Here 文档的结束。结束标记被称为终止符。终止符之前的文本行将合并在一起,包括换行符和任何其他空白。

puts <<GROCERY_LIST
Grocery list
------------
1. Salad mix.
2. Strawberries.*
3. Cereal.
4. Milk.*

* Organic
GROCERY_LIST

结果

Grocery list
------------
1. Salad mix.
2. Strawberries.*
3. Cereal.
4. Milk.*

* Organic

如果我们向 puts 函数传递多个参数,那么从 Here 文档创建的字符串文字将被插入到参数列表中,无论 << 运算符出现在哪里。

在下面的代码中,Here 文档(包含四个杂货店商品和一个空行)作为第三个参数传递进来。我们得到与上面相同的输出。

puts 'Grocery list', '------------', <<GROCERY_LIST, '* Organic'
1. Salad mix.
2. Strawberries.*
3. Cereal.
4. Milk.*

GROCERY_LIST

多个 Here 文档

[编辑 | 编辑源代码]

你也可以在参数列表中包含多个 Here 文档。我们在每个 Here 文档的末尾添加了一个空行,以便使输出更易读。

puts 'Produce', '-------', <<PRODUCE, 'Dairy', '-----', <<DAIRY, '* Organic'
1. Strawberries*
2. Blueberries

PRODUCE
1. Yogurt
2. Milk*
3. Cottage Cheese

DAIRY

运行此代码后的输出是

Produce
-------
1. Strawberries*
2. Blueberries

Dairy
-----
1. Yogurt
2. Milk*
3. Cottage Cheese

* Organic

我们一直在我们的示例中使用 puts 函数,但是你可以将 Here 文档传递给任何接受字符串的函数。

如果缩进 Here 文档内的行,则会保留前导空白。但是,终止符之前不能有任何前导空白。

puts 'Grocery list', '------------', <<Grocery_list
    1. Salad mix.
    2. Strawberries.
    3. Cereal.
    4. Milk.
Grocery_list

结果

Grocery list
------------
    1. Salad mix.
    2. Strawberries.
    3. Cereal.
    4. Milk.

缩进终止符

[编辑 | 编辑源代码]

如果为了可读性,你还想缩进终止符,请使用 <<- 运算符。

puts 'Grocery list', '------------', <<-GROCERY_LIST
    1. Salad mix.
    2. Strawberries.
    3. Cereal.
    4. Milk.
    GROCERY_LIST

但是,请注意,Here 文档内每行文本之前的空白仍然会保留。

Grocery list
------------
    1. Salad mix.
    2. Strawberries.
    3. Cereal.
    4. Milk.

引用规则

[编辑 | 编辑源代码]

你可能想知道 Here 文档是否遵循单引号双引号 规则。

双引号规则

[编辑 | 编辑源代码]

如果标识符周围没有引号,就像我们之前的示例中那样,那么 Here 文档的主体将遵循双引号规则。

name = 'Charlie Brown'

puts <<QUIZ
Student: #{name}
 
1.\tQuestion: What is 4+5?
\tAnswer: The sum of 4 and 5 is #{4+5}
QUIZ

这个示例的输出是

Student: Charlie Brown
 
1.&#09;Question: What is 4+5?
&#09;Answer: The sum of 4 and 5 is 9

如果在标识符周围加上双引号,则也会遵循双引号规则。但是,不要在终止符周围加上双引号。

puts <<"QUIZ"
Student: #{name}

1.\tQuestion: What is 4+5?
\tAnswer: The sum of 4 and 5 is #{4+5}
QUIZ

单引号规则

[编辑 | 编辑源代码]

要创建一个遵循单引号规则的 Here 文档,请在标识符周围加上单引号。

puts <<'BUS_SCHEDULES'
c:\napolean's documents\tomorrow's bus schedule.txt
c:\new documents\sam spade's bus schedule.txt
c:\bus schedules\the #9 bus schedule.txt
BUS_SCHEDULES

结果

c:\napolean's documents\tomorrow's bus schedule.txt
c:\new documents\sam spade's bus schedule.txt
c:\bus schedules\the #9 bus schedule.txt
华夏公益教科书