我无法弄清楚下面Ruby程序的功能。我知道我们正在打开xxx.csv&创建9列,但我不明白以下内容:
out <<
,do |out|
,(1..10).map{|i| "r" + i.to_s}
(1..10代表一组1到10 ???),map
方法及其参数,{{{ 1}}。
flatten.join("\t") + "\n"
数据示例:File.open("xxxx.csv", "w") do |out|
out << [
'x', 'y', 'l', 'b',
'r', 'v', (1..10).map{|i| "r" + i.to_s},
'xxx', 'd'
].flatten.join("\t") + "\n"
我正在学习Ruby和一般的编程,如果我的问题是基本的,我会道歉。
由于 艾米
答案 0 :(得分:0)
另请参阅Export content of a SQLite3 table in CSV以获得有关您问题的答案。
但要解释一下代码。让我们尝试部分:
p (1..10).map{|i| "r" + i.to_s}
结果:
["r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"]
现在让我们详细说明:
(1..10)
是一个Range对象。如果你执行
(1..10).to_a
你得到一个从1到10的数组:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
。
map
在范围的对象上循环,并使用给定块的结果创建一个新数组。因此,(1..10).map{|i| "r" + i.to_s}
循环覆盖范围1到10的所有值,为块内部变量i
提供值并构建一个带有r
和(+
)的新字符串数字i
的字符串表示形式(to_s
表示字符串)。
你会得到一个这样的数组:
["x", "y", "l", "b", "r", "v",
["r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"],
"xxx", "d"
]
flatten
使数组变平。如果数组中有数组,则flatten
解析内部数组并使其“平坦”
示例:
[1,[2,3]].flatten #[1, 2, 3]
join
获取数组的所有条目并将它们连接成一个字符串。 (可选)参数定义两个元素之间的内容。因此,在您的代码中,您将所有条目作为带有tab-separartor的csv-line。
最后添加换行符。
分步骤:
["x", "y", "l", "b", "r", "v",
["r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"],
"xxx", "d"
].flatten
结果
["x", "y", "l", "b", "r", "v",
"r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", #No inner array any longer
"xxx", "d"
]
然后加入完成:
["x", "y", "l", "b", "r", "v",
"r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
"xxx", "d"
].join("\t")
结果:
"x\ty\tl\tb\tr\tv\tr1\tr2\tr3\tr4\tr5\tr6\tr7\tr8\tr9\tr10\txxx\td"