我喜欢eval
在Ruby中,因为它的工作原理很简单:如何从Crystal中的字符串变量执行代码?
eval("puts 7 * 8") # => 56
什么是eval
的水晶相同呢?我知道,我们可以用宏类似的东西:
macro eval(code)
{{code.id}}
end
eval("puts 7 * 8") # => 56
但是,这不会与运行时的值工作:
a = "yo"
eval("puts #{a}") # => prints nothing
我喜欢eval
在Ruby中,因为它的工作原理很简单:如何从Crystal中的字符串变量执行代码?
eval("puts 7 * 8") # => 56
什么是eval
的水晶相同呢?我知道,我们可以用宏类似的东西:
macro eval(code)
{{code.id}}
end
eval("puts 7 * 8") # => 56
但是,这不会与运行时的值工作:
a = "yo"
eval("puts #{a}") # => prints nothing
水晶是编译型语言,而Ruby的解释。这使得在运行时评估代码变得更加复杂。
在你的例子中,宏在编译时被扩展,所以实际上你的程序只是puts 7 * 8
。换句话说,它的工作原理是编译时知道代码。
但是,如果您想执行包含在任意字符串中的代码,则必须调用Crystal编译器,然后执行生成的可执行文件。这实际上是我们在Crystal单元测试中做的事情。但标准库中没有包含“eval”函数,因为这意味着编译的程序包含内置的Crystal编译器,实际上没有多大意义。
另一个问题是如何传递参数并获取返回值。由于您运行的程序和评估的代码是不同编译的结果,因此它们可能具有不同的相同类型的二进制表示。
另一方面,在Ruby中使用eval
通常被认为是不好的做法,必须尽可能避免。
感谢您的解释 –
您可以使用[运行宏方法](http://crystal-lang.org/api/Macros.html#run%28filename%2C%20%2Aargs%29%20%3A%20MacroId-instance-method ),但这在罕见的情况下才是好事。我甚至不会在Ruby中使用eval,为什么不问你实际想要达到什么? –