Ruby:带字符串插值的eval

时间:2013-06-18 13:06:45

标签: ruby string eval string-interpolation

我不明白,为什么eval的工作原理如下:

"123 #{456.to_s} 789" # => "123 456 789"
eval('123 #{456.to_s} 789') # => 123

如何插入eval内的字符串?

更新

谢谢你,朋友们。有效。

因此,如果您想要稍后评估#{}的字符串变量,则应按照以下说明进行操作:

string = '123 #{456} 789' 
eval("\"" + string + "\"")
# => 123 456 789

string = '123 #{456} 789' 
eval('"' + string + '"')
# => 123 456 789

2 个答案:

答案 0 :(得分:20)

正在发生的事情是,eval正在将字符串作为源代码进行评估。当您使用双引号时,字符串是插值的

eval '"123 #{456.to_s} 789"'
# => "123 456 789"

但是当你使用单引号时,没有插值,因此#开始评论,你得到

123 #{456.to_s} 789
# => 123

字符串插值发生在eval调用之前,因为它是方法的参数。

另请注意,456.to_s是不必要的,您只需执行#{456}

答案 1 :(得分:4)

你想:

eval('"123 #{456.to_s} 789"')

。 。 。希望你能明白为什么?

从eval传递给解释器的代码就像你编写它(进入irb,或作为.rb文件的一部分),所以如果你想要一个eval输出一个字符串值,您评估的字符串必须包含使其中的表达式为String的引号。