Строковый массив для eval - PullRequest
3 голосов
/ 21 ноября 2008

Я готовлю строку, которая будет eval 'ред. Строка будет содержать предложение, построенное из существующего 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 переменной?

Спасибо!

Ответы [ 3 ]

8 голосов
/ 21 ноября 2008

inspect должен выполнить то, что вы хотите.

>> a = %w(a b c)
=> ["a", "b", "c"]
>> a.inspect
=> "[\"a\", \"b\", \"c\"]"
0 голосов
/ 25 ноября 2008

Есть ли способ назначить вывод из метода p в переменную?

p (так же, как put) записывает свой аргумент в $ 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)
0 голосов
/ 21 ноября 2008

Возможно, я вас неправильно понимаю, но выглядит ли это лучше?

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

Полагаю, меня смущает необходимость в eval, если только это не часть того, что я вижу здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...