ruby将变量值添加到数组中

时间:2010-03-09 15:13:58

标签: ruby

我有一个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/

3 个答案:

答案 0 :(得分:5)

您可以使用tmp_path.dup克隆字符串,然后再将其推送到数组。

但是我不明白为什么你要做所有这些(保留创建目录的列表)。看一下FileUtils#mkdir_p,你传递一个你想要创建的目录的路径,然后创建它,以及所有缺少的父目录。

答案 1 :(得分:2)

  

当我将tmp_path推送到created_pa​​ths数组时,似乎添加了对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 + "/"

无论哪种方式,您都在创建一个新的字符串对象,而不是修改现有的字符串对象。