Ruby 编程/Here 文档
外观
< Ruby 编程
为了创建多行字符串,Ruby 支持Here 文档(Heredoc),这是一个源自Bourne shell 的特性,在Perl 和PHP 中也有使用。
要构建一个 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 文档的末尾添加了一个空行,以便使输出更易读。
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.	Question: What is 4+5?
	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