为什么使用ruby eval执行包含函数调用的字符串失败

时间:2012-11-13 17:21:47

标签: ruby

我对Ruby很新,所以我希望这个问题在其他地方尚未得到解答。但我一直在这里和互联网上搜索相当长一段时间没有结果。

我正在从文本文件中读取一堆文件路径。每个文件路径都有一些嵌入到字符串中的表达式(即#{...})。例如:

input = 'E:/files/storage/#{high_or_low}/#{left_or_right}/*.dll'

无论如何,我想评估这些字符串,好像它们是ruby代码并将这些表达式替换掉。例如:

def high_or_low
    'low'
end

def left_or_right
    'left'
end

# It represents a file path on the disk drive
input = 'E:/files/storage/#{high_or_low}/#{left_or_right}/*.dll'
puts input

# Now how do I execute this 'input' string so that it behaves as if it was defined with quotes?
result = eval input
puts result

我故意在原始输入字符串周围放置单引号,以表明当字符串从磁盘进入时,嵌入在字符串中的表达式将被取消评估。那么如何用这些表达式来评估字符串呢?使用如上所示的eval似乎不起作用。我收到这个错误:

test_eval.rb:15: compile error (SyntaxError)
test_eval.rb:15: syntax error, unexpected tIDENTIFIER, expecting $end

由于

2 个答案:

答案 0 :(得分:1)

pst指出你失败的原因。作为替代方案,取决于您的数据看起来可能有效,也可能无效......但如果它是带有方法名称的简单字符串(特别是不包含嵌套的“}”...

result = input.gsub(/\#{(.*?)}/) {|s| send($1)}
puts result

答案 1 :(得分:0)

啊,发现了。 pst让我开始朝着正确的方向前进。 所以,一旦我将输入变量包装在这样的引号中,就可以了:

result = eval '"' + input + '"'
puts result

=> E:/文件/存储/低/左/ * DLL