在为飓风irma做准备时,我写了一个快速垃圾脚本,下载了一堆关于exercism.io的练习。它有效,但在调用threads.each
时出现了一个错误,我不明白,所有的代码直到threads.each是同步的,如果我理解正确,那么我就是这样不确定最好的修复方法是:。
rb:14:in '<main>': undefined method 'each' for nil:NilClass (NoMethodError)
这对我很有意思,因为我收到了错误,但程序仍按预期运行,所以我确定我没有正确地写这个。
language = ARGV[0]
exercises = `exercism list #{@language}`.split("\n")
threads = exercises.map do |exercise|
break if exercise == ''
Thread.new do
system("exercism fetch #{language} #{exercise}")
end
end
threads.each(&:join)
答案 0 :(得分:1)
使用next
代替break
,以便在任何练习空白时仍设置threads
。 break
将取消整个循环,但next
将仅跳过当前迭代。
如果他们的练习是空白的,那么一些线程仍然可以是nil
,因为没有为他们开始线程。您可以使用threads.compact.each(&:join)
跳过这些nil
值。
或者,如果您需要break
,请在循环内添加threads
,如:
threads = []
exercises.each do |exercise|
break if exercise == ''
threads << Thread.new do
system("exercism fetch #{language} #{exercise}")
end
end