Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将array.inspect的输出解析回数组_Ruby_Arrays_String_Parsing - Fatal编程技术网

Ruby 如何将array.inspect的输出解析回数组

Ruby 如何将array.inspect的输出解析回数组,ruby,arrays,string,parsing,Ruby,Arrays,String,Parsing,我想在文本文件中存储多维数组,并高效地重新加载它们。棘手的是,数组中包含的字符串可能看起来像“]、[\\\\”或任何东西 将表写入文件的最简单方法就像my_array.inspect(对吗?) 然后,如何从文本文件中读回一个字符串,该字符串可能看起来像“[\”],[\\“\\”],[\\\\“]”(与上述情况相同),并尽可能快速、无痛苦地重新创建数组?假设您有数组 ary 您可以将数组写入文件: File.open(path, 'w') { |f| f.write Marshal.dump(a

我想在文本文件中存储多维数组,并高效地重新加载它们。棘手的是,数组中包含的字符串可能看起来像
“]、[\\\\”
或任何东西

将表写入文件的最简单方法就像
my_array.inspect
(对吗?)

然后,如何从文本文件中读回一个字符串,该字符串可能看起来像
“[\”],[\\“\\”],[\\\\“]”
(与上述情况相同),并尽可能快速、无痛苦地重新创建数组?

假设您有数组

ary
您可以将数组写入文件:

File.open(path, 'w') { |f| f.write Marshal.dump(ary) }
然后通过将文件读入字符串并说

ary = Marshal.load(File.read(path))

在我看来,这听起来太麻烦了。改用


另一种选择是,您可以使用。

如果您的数组只包含按字面意思编写的对象,如数字、字符串、数组、哈希,则可以使用
eval

a = [1, 2, 3].inspect
# => "[1, 2, 3]"

eval(a)
# => [1, 2, 3]

如果您可以发布一个文本文件的示例,这样我们就可以确切地看到您要完成的任务,这可能会有所帮助。解决方案很有趣,但二进制序列化也有它自己的一系列问题。我尝试在生产中避免封送/pickle,而改用YAML或JSON。如果您想要纯文本序列化格式,您可能需要使用yajl-ruby gem…他们说它甚至比封送更快…用“Yajl::Encoder.encode”替换“Marshal.dump”,用“Yajl::Parser.parse”替换“Marshal.load”Nat,二进制序列化很棘手,只适用于一种编程语言。使用YAML或JSON,您可以将数组加载到Ruby、Python、C等中。此外,如果某些内容无法正常工作,您可以查看文本文件进行调试,而不是解析二进制数据。这正是我想知道的。尽管我使用了YAML op我同意Kudu的观点,eval()是错误的方法。使用纯文本(Yaml,JSON)或二进制(Marshal),但要非常小心,依赖执行任意Ruby代码作为序列化的一种形式。
a = [1, 2, 3].inspect
# => "[1, 2, 3]"

eval(a)
# => [1, 2, 3]