0

我对 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

谢谢

4

2 回答 2

1

pst 指出了它失败的原因。作为替代方案,这可能会或可能不会工作,具体取决于您的数据的样子......但如果它是带有方法名称的简单字符串(特别是不包含嵌套的“}”......

result = input.gsub(/\#{(.*?)}/) {|s| send($1)}
puts result
于 2012-11-13T17:35:06.967 回答
0

啊找到了。pst 让我朝着正确的方向开始。因此,一旦我将输入变量用这样的引号括起来,它就起作用了:

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

=> E:/files/storage/low/left/*.dll

于 2012-11-13T18:04:11.547 回答