Thursday, October 16, 2008

(9)here documents

有时候我们的字符串会很长,使用分界符号的方式可能也行不通,比如我们有时候可能忘了什么地方需要进行转义(\)。Ruby提供了另一个方便的方法,在你使用长文本内容的时候非常有用。
你可以以<<或者<<-符号开始,然后紧跟一个你自定义的字符串,长文本内容的结束部分使用相同的自定义字符串告诉Ruby这个长文本已经结束了:
document = <<HERE      #以<<定义HERE为文本开始的关键字 
This is a string literal.
It has two lines and abruptly ends...
HERE
#以相同的HERE关键字结尾,注意这里的HERE结束关键字必须在单独的一行,并且其后不能有任何字符,空格也不行

如果有多个here documents的时候,Ruby会顺序的读取其中的内容,读完一个然后返回,从头读另一个,比如下面的文档输出结果为:Hello there world:
greeting = <<HERE + <<THERE + "World"
Hello
HERE
There
THERE

如果你希望你的文本非常的“文本化”,比如给他加上某些说明,你甚至可以定义一段字符串为开始和结束标记:
document = <<'THIS IS THE END, MY ONLY FRIEND, THE END'
.
. lots and lots of text goes here
. with no escaping at all.
.
THIS IS THE END, MY ONLY FRIEND, THE END

注意,结束标记处,没有单引号。
同样你还可以使用双引号为标记的文本。

最后再提一点,字符串对象是可变的,在Ruby中你不能用同一个对象表示两个相同的文本(Java程序员会觉得这很奇怪),每当Ruby解析到一个字符串文本,他就会创建一个新的对象,也就是说如果你在一个循环中使用了字符串文本,那么每个循环都会创建一个新的对象,你可以试试下面的代码:
10.times { puts "test".object_id }

基于性能的考虑,你应该避免这样作。
另外,你可以使用String.new的方式创建一个空的字符串对象,这和声明一个空的文本是一样的效果。

No comments: