Ruby:使用字符串插值的eval

13

我不明白为什么eval会这样运作:

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

如何在eval内插入字符串?

更新:

谢谢朋友们,它起作用了。

如果你有一个带有#{}的字符串变量,想要稍后使用eval,那么你应该按照下面的说明操作:

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

1
“宏替换”是什么意思? - sawa
@sawa,我指的是#{}部分,请您以正确的方式进行编辑,我只是不知道如何用英语表达。 - Alexander.Iljushkin
1
好的,也许你是指插值。 - sawa
2个回答

24

发生的情况是,eval将字符串作为源代码进行评估。使用双引号时,字符串会被插值处理。

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

然而,当您使用单引号时,没有插值,因此#开始一个注释,并且您会得到:

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

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

另外请注意,456.to_s是不必要的,你可以直接使用#{456}


1
将单引号替换为双引号会导致语法错误,因为 eval("123 #{456.to_s} 789") 被解释为 123 456 789 - Stefan
如果字符串包含#{}和引号,例如:string = '12 #{45} 78 "9" 0',该怎么办? - Max Ivak

5

You wanted:

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

希望你能理解为什么?
从 eval 传递给解释器的代码与您编写的代码完全相同(在 irb 中或作为 .rb 文件的一部分),因此,如果要使 eval 输出字符串值,则评估的字符串必须包括引号,以使其内部表达式成为 String。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接