2010-03-09 74 views
2

我有一個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 " } 

當我到created_paths陣列推tmp_path似乎參照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/ 

回答

5

您可以使用tmp_path.dup它推到陣列之前,克隆的字符串。

但我不明白你爲什麼要做所有的事情(保留創建的目錄列表)。看一下FileUtils#mkdir_p,你將它傳遞給一個你想創建的目錄的路徑,並創建它,連同所有缺失的父目錄。

+0

我試圖避免Dir.mkdir一個SystemCallError如果目錄已創建。我仍然對Ruby API不熟悉,FileUtils看起來更好。感謝您的幫助。 – Mark 2010-03-09 17:00:05

1

問題是該行正在修改原始字符串對象。數組持有對該對象的引用。

tmp_path << part << "/"  

要避免它,您需要創建一個新的對象。

tmp_path += part + "/" 

無論哪種方式,你是一個新的字符串對象,而不是修改現有的一個:要麼當你添加的路徑

created_paths.push(tmp_path.dup) 

還是做到這一點。

2

當我將tmp_path推到created_pa​​ths數組上時,似乎已經添加了對tmp_path的引用,而不是該值。

紅寶石中的所有內容均僅供參考。

當您使用< <您連接到字符串。使用dup方法應該適合你。

mystring = "test" 
myarray = [] 

5.times do |x| 
    mystring << x.to_s 
    myarray << mystring 
end 

puts myarray 

在上面的代碼中設定< <的字符串分配給=並查看輸出的差。

另外,作爲紅寶石的一個附註,您可以使用puts在打印時添加換行符。 所以created_paths.each { |z| print z, "\n " }

可以閱讀created_paths.each { |z| puts z }