2008-11-21 50 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)