在 ruby rake 中循环新创建的数组
loop through newly created array in ruby rake
我还有一个关于 Ruby 的问题。
我想做的是:
- 使用 grep 从文件创建子文件
- 创建一个名为 ARRAY 的新空数组
- 将子文件的每一行作为一个元素推送到 ARRAY
- 遍历 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.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
出现您描述的问题是因为 element
是 each
块中的局部变量。您需要像这样将变量传递给 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 是一个常量(在谈论内容被修改的对象时这很奇怪,但它仍然有效)但是你不能在任务中访问它,因为要这样做你必须将它作为参数传递或(我认为这就是你打算做的)使它成为一个全局变量 $array
(虽然全局变量通常被认为是不好的做法)
解释错误:
- 第一个 (NameError: uninitialized constant ARRAY
) 指的是 ARRAY 属于 Main,无法从 Main > task > File.open
.
访问
- 第二个与 element
相同的问题,在
ARRAY.each do |element|
file_task
end
element
属于 ARRAY.each
,无法从 file_task
访问。再一次,你必须要么将它作为参数传递,要么使其成为全局变量(全局变量仍然是一件坏事!)
我还有一个关于 Ruby 的问题。 我想做的是:
- 使用 grep 从文件创建子文件
- 创建一个名为 ARRAY 的新空数组
- 将子文件的每一行作为一个元素推送到 ARRAY
- 遍历 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.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
出现您描述的问题是因为 element
是 each
块中的局部变量。您需要像这样将变量传递给 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 是一个常量(在谈论内容被修改的对象时这很奇怪,但它仍然有效)但是你不能在任务中访问它,因为要这样做你必须将它作为参数传递或(我认为这就是你打算做的)使它成为一个全局变量 $array
(虽然全局变量通常被认为是不好的做法)
解释错误:
- 第一个 (NameError: uninitialized constant ARRAY
) 指的是 ARRAY 属于 Main,无法从 Main > task > File.open
.
访问
- 第二个与 element
相同的问题,在
ARRAY.each do |element|
file_task
end
element
属于 ARRAY.each
,无法从 file_task
访问。再一次,你必须要么将它作为参数传递,要么使其成为全局变量(全局变量仍然是一件坏事!)