簡體   English   中英

在ruby rake中循環遍歷新創建的數組

[英]loop through newly created array in ruby rake

我對Ruby還有另一個問題。 我想做的是:

  1. 使用grep從文件創建子文件
  2. 創建一個名為ARRAY的新空數組
  3. 將子文件的每一行作為數組中的一個元素
  4. 遍歷ARRAY的每個元素,並為每個元素創建一個文件(#{element} .txt)。

到目前為止,我有:

desc "Create subfile"
file "subfile.txt" => ["infile.txt"] do
sh "grep '>' infile.txt > subfile.txt"
end

desc "Create new array"
task :new_array => ["subfile.txt"] do
ARRAY=Array.new
end

desc "Add elements to array"
task :add_elements => [:new_array] do
File.open("infile.txt").each do |line|
ARRAY.push(line)
end
end

ARRAY.each do |element|
file "#{element}.txt" => [:add_elements] do
sh 'bash command to create #{element}.txt"'
end
end

不幸的是,我得到了錯誤:

NameError: uninitialized constant ARRAY

我認為問題出在以下事實:從一開始就沒有設置我的ARRAY,這是因為創建了中間腳本,並且因為我對上一個任務(:add_elements)的依賴與文件任務file "#{element}.txt" => [:add_elements] do而不是我使用ARRAY ARRAY的實際行ARRAY.each do |element|

一種解決方法是:

multitask :create_element_file => [:add_elements] do
ARRAY.each do |element|
file_task
end

def file_task
file "#{element}.txt" do
sh 'bash command to create #{element}.txt"'
end

但是,它現在抱怨:

NameError: undefined local variable or method `element' for main:Object

有沒有辦法確定設置在腳本中間創建的數組? 我的依賴項有問題嗎? 我如何稱呼我的任務?

任何幫助表示贊賞。

================================================== =========================

使用我選擇的解決方案進行編輯:

我發現我的rakefile變得太復雜了,所以我決定編寫多個連接的rakefile。

rakefile1.rake:

file "subfile.txt" => ["infile.txt"] do
sh "grep '>' infile.txt > subfile.txt"
end

desc "Create subfile"
task :create_subfile => ["subfile.txt"] do
puts "Subfile created"
end

desc "Call next rakefile"
task :next_rakefile => [:create_subfile] do
sh "rake -f rakefile2.rake --trace"
end

rakefile2.rake:

ARRAY=File.readlines("subfile.txt").each {|locus| locus.chomp!}

ARRAY.each do |element|
file "#{element}.txt" => ["subfile.txt"] do
sh "bash command to create #{element}.txt"
end

您描述的問題之所以出現,是因為elementeach塊中的局部變量。 您需要像這樣將變量傳遞給file_task方法:

multitask :create_element_file => [:add_elements] do
  ARRAY.each do |element|
    file_task(element)
  end
end

def file_task(element)
  file "#{element}.txt" do
    sh 'bash command to create #{element}.txt"'
  end
end

我認為您混淆了常量和全局變量。 在這里,ARRAY是一個常數(當談論內容已修改但仍然有效的對象時,它是奇怪的imo),但是您無法在任務中訪問它,因為這樣做必須將其作為參數傳遞,或(我認為這就是您要執行的操作)將其設置為全局變量$array (不過,通常認為全局變量是不好的做法)

解釋錯誤:
-第一個( NameError: uninitialized constant ARRAY )是指ARRAY屬於Main的事實,無法從Main > task > File.open
-第二個是與element相同的問題,在

ARRAY.each do |element|
    file_task
end

element屬於ARRAY.each ,不能從file_task訪問。 再一次,您必須要么將其作為參數傳遞,要么將其設置為全局(全局變量仍然是一件壞事!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM