Ruby here document
最基本用法
<<
后跟一个标记字符, 中间写内容, 在新的一行顶格重复标记字符.
-
标记一般都大写, 小写在语法上也可以.
-
结束行必须顶格, 没有前导空格.
-
中间内容会生成原样的带换行的字符串
str = <<hello
你好:
Hello, world!
hello
p str
=begin
"你好:\n Hello, world!\n"
=end
- 也可以在标记字符两边加引号
str = <<"hello"
你好:
Hello, world!
hello
str = <<'hello'
你好:
Hello, world!
hello
插值
字符串插值适用:
name = "小红"
str = <<MAIL
你好#{name}:
Hello, world!
#{Time.now}
MAIL
p str
=begin
"你好小红:\n Hello, world! \n2019-03-15 17:47:21 +0800\n"
=end
连续标记
str1, str2 = <<NAME, <<AGE
This is 小明.
NAME
I'm 18.
AGE
p str1, str2
=begin
"This is 小明.\n"
"I'm 18.\n"
=end
def func(a:, b:, c:)
p a, b, c
end
func a: <<PARAM_A, b: <<PARAM_B, c: '啦啦啦'
Hello
PARAM_A
world
PARAM_B
=begin
"Hello\n"
"world\n"
"啦啦啦"
=end
修饰方法
可以在标记字符串后面紧方法调用, 来处理返回的字符串:
def func(name: '小明')
str = <<MAIL.upcase
你好#{name}:
Hello, world!
MAIL
end
p func
=begin
" 你好小明:\n HELLO, WORLD!\n"
=end
处理对齐
<<HERE_DOC
要求标记顶格写, 为了美化缩进, 此时换用可以 <<-HERE_DOC
:
def func(name: '小明')
str = <<-MAIL
你好#{name}:
Hello, world!
MAIL
end
p func
=begin
" 你好小明:\n Hello, world!\n"
=end
前导空格的处理
但是为了对齐的美观, 就会徒增一些前导空格. Rails提供了一个方法, 以非空行的第一个字符为基准, 去掉其他行的前导空格:
require 'active_support/core_ext/string'
def func(name: '小明')
str = <<MAIL.upcase.strip_heredoc
你好#{name}:
Hello, world!
MAIL
end
p func
=begin
" 你好小明:\nHELLO, WORLD!\n"
=end