我正在准备一个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
方法的输出分配给变量?
谢谢!
答案 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)