我喜欢evalRuby,因为它的工作非常简单:
eval("puts 7 * 8") # => 56
Run Code Online (Sandbox Code Playgroud)
什么是eval水晶的等价物?我知道我们可以用宏做类似的事情:
macro eval(code)
{{code.id}}
end
eval("puts 7 * 8") # => 56
Run Code Online (Sandbox Code Playgroud)
但这不适用于运行时值:
a = "yo"
eval("puts #{a}") # => prints nothing
Run Code Online (Sandbox Code Playgroud)
waj*_*waj 14
Crystal是一种编译语言,而Ruby则被解释.这使得在运行时评估代码变得更加复杂.
在您的示例中,宏在编译时展开,因此实际上您的程序就是puts 7 * 8.换句话说,它的工作原理是因为代码在编译时是已知的.
但是如果你想执行包含在任意字符串中的代码,它必须调用Crystal编译器然后执行生成的可执行文件.这实际上是我们在Crystal单元测试中所做的事情.但是标准库中没有包含"eval"函数,因为这意味着您的编译程序包含内置的Crystal编译器,实际上没有多大意义.
另一个问题是如何传递参数并获取返回值.由于您运行的程序和评估的代码是不同编译的结果,因此它们可能具有相同类型的不同二进制表示.
另一方面,eval在Ruby中使用通常被认为是一种不好的做法,如果可能必须避免使用.
| 归档时间: |
|
| 查看次数: |
784 次 |
| 最近记录: |