2008-11-21 2 views
3

Я готовлю строку, которая будет eval 'ed. Строка будет содержать предложение, построенное из существующего Array. У меня есть следующие:Stringify array for eval

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, yes 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 (то же, что и 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)