用于eval的Stringify数组

时间:2008-11-21 14:31:27

标签: ruby

我正在准备一个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 个答案:

答案 0 :(得分:8)

inspect应该达到你想要的效果。

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

答案 1 :(得分:0)

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

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

我想我对eval的需要感到困惑,除非这是我在这里看到的东西的一部分。

答案 2 :(得分: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)