12

我不明白,为什么这样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
4

2 回答 2

22

发生了什么,是 eval 正在评估字符串作为源代码。当你使用双引号时,字符串被插值

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

但是,当您使用单引号时,没有插值,因此#开始注释,您会得到

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

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

另请注意,这456.to_s是不必要的,您可以这样做#{456}

于 2013-06-18T13:12:30.037 回答
5

You wanted:

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

. . . hopefully you can see why?

The code passed to the interpretter from eval is exactly as if you had written it (into irb, or as part of a .rb file), so if you want an eval to output a string value, the string you evaluate must include the quotes that make the expression inside it a String.

于 2013-06-18T13:12:05.750 回答