我有一个Ruby 1.8.6脚本,它应该采用包含路径的文件名,创建文件夹然后将文件移动到文件夹中。我有一个数组created_paths
来跟踪创建的文件夹(脚本将遍历大量文件)。我在添加created_paths
数组时遇到问题。
created_paths = Array.new
file_name = "first\\second\\third.txt"
parts = file_name.split('\\')
tmp_path = ""
parts.each_with_index { |part,i|
if i == (parts.length - 1)
# copy file to new dir structure
else
tmp_path << part << "/"
if !created_paths.include?(tmp_path)
puts "add to array: #{tmp_path}"
created_paths.push(tmp_path)
# create folder
end
end
}
puts "size=#{created_paths.length}\n"
created_paths.each { |z| print z, "\n " }
当我将tmp_path
推送到created_paths
数组时,似乎已添加对tmp_path
的引用,而不是值。在循环的第二次迭代created_paths.include?(tmp_path)
返回True。如何将tmp_path
的值存储在我的数组中,或者是否存在我缺少的范围问题?
我的输出:
add to array: first/
size=1
first/second/
我的例外输出:
add to array: first/
add to array: first/second/
size=2
first/
first/second/
答案 0 :(得分:5)
您可以使用tmp_path.dup
克隆字符串,然后再将其推送到数组。
但是我不明白为什么你要做所有这些(保留创建目录的列表)。看一下FileUtils#mkdir_p,你传递一个你想要创建的目录的路径,然后创建它,以及所有缺少的父目录。
答案 1 :(得分:2)
当我将tmp_path推送到created_paths数组时,似乎添加了对tmp_path的引用而不是值。
红宝石中的所有东西都是参考。
使用&lt;&lt;你正在连接到字符串。使用dup方法应该适合你。
mystring = "test"
myarray = []
5.times do |x|
mystring << x.to_s
myarray << mystring
end
puts myarray
在上面的代码段集中&lt;&lt;将字符串赋值给=并查看输出的差异。
另外,作为ruby中的旁注,您可以在打印时使用puts添加换行符。
所以created_paths.each { |z| print z, "\n " }
可以阅读created_paths.each { |z| puts z }
答案 2 :(得分:1)
问题是此行正在修改原始字符串对象。该数组包含对该对象的引用。
tmp_path << part << "/"
要避免它,您需要创建一个新对象。在添加路径时执行此操作
created_paths.push(tmp_path.dup)
或者做:
tmp_path += part + "/"
无论哪种方式,您都在创建一个新的字符串对象,而不是修改现有的字符串对象。