2008-11-21 86 views
3

我正在准备一个字符串,它将是eval'ed。该字符串将包含从现有的Array构建的子句。我有以下几种:将字符串数组用于评估

def stringify(arg) 
    return "[ '" + arg.join("', '") + "' ]" if arg.class == Array 
    "'#{arg}'" 
end 

a = [ 'a', 'b', 'c' ] 
eval_str = 'p ' + stringify(a) 
eval(eval_str) 

打印字符串["a", "b", "c"]

有没有更习惯的方式来做到这一点? Array#to_s不会削减它。有没有办法将p方法的输出分配给变量?

谢谢!

回答

8

inspect应该完成你想要的。

>> a = %w(a b c) 
=> ["a", "b", "c"] 
>> a.inspect 
=> "[\"a\", \"b\", \"c\"]" 
+0

检查是完美的。谢谢! @dylanfm,是的eval只用于上下文。 – 2008-11-22 12:11:31

0

我可能会误解你,但是这样看起来更好吗?

>> a = %w[a b c] 
=> ["a", "b", "c"] 
>> r = "['#{a.join("', '")}']" 
=> "['a', 'b', 'c']" 
>> r.class 
=> String 

我想我对eval的需求感到困惑,除非这是我看到的东西之外的一部分。

0

是否有从p方法输出 分配给一个变量的方法吗?

p(与puts相同)将其参数写入$ stdout并返回nil。为了捕获这个输出,你需要暂时重新定义$ stdout。

require 'stringio' 

def capture_stdout 
    old = $stdout 
    $stdout = StringIO.new(output = "") 
    begin 
    yield 
    ensure 
    # Wrapping this in ensure means $stdout will 
    # be restored even if an exception is thrown 
    $stdout = old 
    end 
    output 
end 

output = capture_stdout do 
    p "Hello" 
end 

output # => "Hello" 

我不知道为什么你需要用这个例子,你可以只是做

output = stringify(a)