Ruby 的 heredoc 与 eval
在如 rails 这样的开源库中,咱们常常见到这样的一类写法:
class_eval <<-RUBY, __FILE__, __LINE__ + 1
def xxx
# do something here
end
RUBY
令人困惑不已。
不过这儿的知识点非常简略,只需把握了 heredoc 与 eval 的用法,就很好了解这儿的代码了。
heredoc
heredoc 是一种界说多行字符串的办法,一起坚持原始缩进和格局。相当于 JavaScript 中的 ``。
heredoc 以 <<-
最初,跟上一个随意的单词,最终再以这个字符串完毕:
multi_str = <<-FOO
1
2
3
FOO
puts multi_str
多行字符串会保存一切的缩进,并且在尾部会带上 \n
换行符。
关于换行符,能够运用 chomp
来去除:<<-FOO.chomp
。
假如你在缩进的情况下声明 heredoc,可能会变成这样,非常丑恶:
multi_str = <<-FOO
1
2
3
FOO
假如坚持缩进:
multi_str = <<-FOO
1
2
3
FOO
最终的输出成果也会带上 1 一切缩进,这儿能够运用 ~
替代 -
,或是运用 strip
。
multi_str = <<~FOO
1
2
3
FOO
multi_str = <<-FOO.strip
1
2
3
FOO
这两种办法都会以榜首行为规范,在一切行的最初,删去空格。
eval
eval 在许多脚本语言中都存在,它能够让咱们将字符串作为代码履行。
ruby 中存在多个 eval 办法,比方 eval
class_eval
module_eval
instance_eval
等。
他们别离能够完成不同的 eval 功用。
以 class_eval
为例:
class Foo
STR = <<-RUBY
def say
p 'I am Foo'
end
RUBY
Module.class_eval STR
end
Foo.say
咱们能够轻松将字符串变成办法。
代码剖析
现在咱们总算能够看懂这段代码了,它其实便是运用了 heredoc 多行字符串,将字符串里变成了一个真实的 ruby 办法。
class_eval <<-RUBY, __FILE__, __LINE__ + 1
def xxx
# do something here
end
RUBY
那么后边的 __FILE__, __LINE__ + 1
有什么用呢?
其实咱们完全能够不传这两个参数。
可是参加咱们字符串生成的办法报了错该怎么办呢?一般咱们的办法报错都会有文件名、行号。
eval 运用字符串生成办法,天然没有这些东西,所以咱们传入当时文件的文件名,和当时行的行号+1,来协助 Ruby 生成更好的报错信息。
(完)