如何遍历 ARGV 并为 Ruby 中数组中的每个值创建一个线程

How do you iterate over ARGV and create a Thread for each value in the array in Ruby

我正在尝试创建一个 Ruby 脚本,该脚本为 ARGV 中传递的每个参数启动一个单独的线程,但我不知道如何迭代它们并将它们传递到线程中作为常量(或线程安全)。类似于:

compile.rb

require 'rubygems'
require 'compass'
require 'compass/exec'

threads = []
ARGV.each do |arg|
  threads << Thread.new { Compass::Exec::SubCommandUI.new(["compile", arg]).run! }
end
threads.each { |thr| thr.join }

结果是它会创建预期数量的线程,但每个线程都会 运行 相同的 arg 值(循环没有按预期工作)。

我正在尝试从 Ant 运行 它,像这样:

build.xml

<java fork="true" failonerror="true" classpathref="jruby.classpath" classname="org.jruby.Main">
    <arg path="${ext.path}\compile.rb"></arg>
    <arg line="${config.rb.dirs.str}"></arg>
</java>

其中 "config.rb.dirs.str" 包含我到多个 Sass 项目的路径,space 分开。

我是Ruby的新手,所以请不要评判。谢谢!

你能运行关注并告诉我们输出结果吗? 您可以 运行 它与 args 或使用脚本中指定的默认 args。 这只是传递变量的两种方式(我更喜欢第二种)。我认为这是一个最小的示例,不需要任何额外的东西。

args = ARGV.size > 0 ? ARGV : ['arg1', 'arg2', 'arg3']

puts "args is #{args} and has size #{args.size}"
threads = args.map do |arg|
  Thread.new do
    sleep 1
    print "Arg is: #{arg}\n"
  end
end

threads.each(&:join)

puts "--"


threads = args.map do |arg|
  Thread.new(arg) do |value|
    sleep 1
    print "Arg is: #{value}\n"
  end
end

threads.each(&:join)