Tag: 枚举器

Swift相当于Ruby的“each_cons”

ruby Ruby有each_cons可以像这样使用 class Pair def initialize(left, right) @left = left @right = right end end votes = [“a”, “b”, “c”, “d”] pairs = votes.each_cons(2).map { |vote| Pair.new(*vote) } p pairs # [#, #, #] 迅速 swift中的代码相同,但没有each_cons函数 struct Pair { let left: String let right: String } let votes = [“a”, “b”, “c”, “d”] var pairs […]

枚举器如何在Ruby 1.9.1中工作?

这个问题不是关于如何在Ruby 1.9.1中使用枚举器,而是我很好奇它们是如何工作的。 这是一些代码: class Bunk def initialize @h = [*1..100] end def each if !block_given? enum_for(:each) else 0.upto(@h.length) { |i| yield @h[i] } end end end 在上面的代码中,我可以使用e = Bunk.new.each ,然后使用e.next , e.next来获取每个连续的元素,但是它究竟是如何暂停执行然后在正确的位置恢复? 我知道如果0.upto的产量被0.upto取代,那么它很容易理解,但这不是这里的情况。 这是一个普通的老yield ,它是如何工作的? 我看了一下enumerator.c,但对我来说这是不可理解的。 也许有人可以在Ruby中提供一个实现,使用光纤,而不是1.8.6样式的基于延续的枚举器,这一切都清楚了吗?

Ruby中的线程安全枚举器

TLDR:Ruby中是否有一个线程安全的Enumerator类版本? 我想做什么: 我在Ruby On Rails应用程序中有一个方法,我希望同时运行。 该方法应该创建一个包含来自站点的报告的zip文件,其中zip中的每个文件都是PDF。 从html到PDF的转换有点慢,因此需要multithreading。 我的期望如何: 我想使用5个线程,所以我想我会在线程之间有一个共享的枚举器。 每个线程都会从Enumerator中弹出一个值,并运行do stuff。 以下是我认为它会起作用的方式: t = Zip::OutputStream::write_buffer do |z| mutex = Mutex.new gen = Enumerator.new{ |g| Report.all.includes(“employee” => [“boss”, “client”], “projects” => {“project_owner” => [“project_team”]}).find_each do |report| g.yield report end } 5.times.map { Thread.new do begin loop do mutex.synchronize do @report = gen.next end title = @report.title […]