红宝石:EVAL用绳子插值

问题描述 投票:10回答:2

我不明白,为什么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
ruby string eval string-interpolation
2个回答
20
投票

这是怎么回事,是EVAL正在评估字符串作为源代码。当您使用双引号,该字符串插值

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

然而,当你使用单引号,没有插,因此#注释的开始,你会得到

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

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

还要注意456.to_s是不必要的,你可以做#{456}


4
投票

你自找的:

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

。 。 。希望你可以看到为什么?

通过从使用eval interpretter的代码是完全一样的,如果你写了它(到irb,或作为.rb文件的一部分),所以如果你想要一个eval输出一个字符串值,评估字符串必须包括引号是让里面一个String表达。

© www.soinside.com 2019 - 2024. All rights reserved.