【问题标题】:How to execute code from a string variable in Crystal?如何从 Crystal 中的字符串变量执行代码?
【发布时间】:2015-06-24 20:17:29
【问题描述】:

我喜欢 Ruby 中的 eval,因为它工作起来非常简单:

eval("puts 7 * 8") # => 56

eval 在 Crystal 中的等价物是什么?我知道我们可以用宏做类似的事情:

macro eval(code)
 {{code.id}}
end

eval("puts 7 * 8") # => 56

但这不适用于运行时值:

a = "yo"
eval("puts #{a}") # => prints nothing

【问题讨论】:

  • 您可以使用run macro method,但这仅在极少数情况下有用。我什至不会在 Ruby 中使用 eval,你为什么不问问你真正想要实现的目标是什么?

标签: eval crystal-lang


【解决方案1】:

Crystal 是一种编译语言,而 Ruby 是解释型语言。这使得在运行时评估代码变得更加复杂。

在您的示例中,宏在编译时展开,所以实际上您的程序只是puts 7 * 8。换句话说,它之所以有效,是因为代码在编译时是已知的。

但是,如果您想执行包含在任意字符串中的代码,则必须调用 Crystal 编译器,然后执行生成的可执行文件。这实际上是我们在 Crystal 单元测试中所做的事情。但是标准库中没有包含“eval”函数,因为这意味着您编译的程序包含内置的 Crystal 编译器,它实际上没有多大意义。

另一个问题是如何传递参数并获取返回值。由于您正在运行的程序和评估的代码是不同编译的结果,因此它们可能具有相同类型的不同二进制表示。

另一方面,在 Ruby 中使用 eval 通常被认为是一种不好的做法,必须尽可能避免。

【讨论】:

  • 感谢解释
猜你喜欢
  • 2021-11-13
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2015-11-08
  • 1970-01-01
  • 2012-07-26
  • 2011-06-15
相关资源
最近更新 更多