这段代码能运行吗?这个 DATA 是什么东西?
require 'erb'
data = DATA.read
title = "hello world!"
content = "hello world!\n"
puts ERB.new(data).result(binding)
__END__
<html>
<head> <%= title %> </head>
<body>
<h1> <%= title %> </h1>
<p>
<%= content %>
</p>
</body>
</html>
输出结果:
<html>
<head> hello world! </head>
<body>
<h1> hello world! </h1>
<p>
hello world!
</p>
</body>
</html>
这个的 DATA 是一个 IO 对象,读取__END__
之后内容。有一点需要注意的是DATA.read
会将__END__
之后的内容一次性读出,由于 IO 读取的特性,当第二此DATA.read
的时候内容就会为空,如果需要第二次读取,那么先要执行DATA.rewind
。
有的时候我们写一个脚本来做一些自动化的工作,需要预先读取一个文件的内容,作为输入或者作为模版,我们可以先把这部分内容附到__END__
后,然后用DATA
来读取,因为它是标准的 IO 对象,我们可以像处理普通文件一样处理__END__
后的内容,如上面的代码所示,用来存储ERB
内容作为模版,然后再进行处理,非常的方便。
本文由OneAPM工程师原创,欢迎大家来OneAPM做客,共同讨论各种技术问题,OneAPM提供包括Ruby在内的主流 6 种编程语言,以及浏览器端、移动端、服务器软硬件环境的性能监测服务。