Hey again, Sorry just had another idea - since it seems like you don't want the enclosing scope/context to be evaluated in a thread, you could try using instance_eval in a "blank" context where you won't have surrounding variables available to your block.
That, and passing arguments to the block as parameters should work but I'm way out of my depth as far as GCD goes. Rob ---- http://robgleeson.github.com Website http://github.com/robgleeson GitHub r...@flowof.info E-Mail On 15 Jul 2010, at 22:29, Rob Gleeson wrote: > Hey ernest, > > I haven't got any experience with GCD but wouldn't it make more sense if > block arguments were received as parameters to the block? > This would make the variables block-local. > > Dispatch::Queue.new("i").sync { |i| # block local 'i' } > > Remember blocks in Ruby are closures, too. > > Rob > ---- > http://robgleeson.github.com Website > http://github.com/robgleeson GitHub > r...@flowof.info E-Mail > > > On 15 Jul 2010, at 21:47, MacRuby wrote: > >> #795: GCD inconsistently copies local variables inside blocks >> ----------------------------------------+----------------------------------- >> Reporter: ernest.prabha...@… | Owner: lsansone...@… >> Type: defect | Status: new >> Priority: critical | Milestone: >> Component: MacRuby | Keywords: >> ----------------------------------------+----------------------------------- >> The expectation is that Ruby blocks will have their local variables copied >> before being passed to GCD, to avoid errors from accessing them after they >> are destroyed. >> >> However, that does not seem to always happen. For example: >> >> $ macruby -e 'i=0; Dispatch::Queue.new("i").sync {i = 42}; puts i' >> >> returns '0' as expected. However, this does not: >> >> $ macirb >> irb(main):001:0> i=0; Dispatch::Queue.new("i").sync {i = 42}; puts i >> 42 >> => nil >> >> It appears to be copied properly in the block_spec.rb test: >> >> it "should create const copies of dynamic (local) variables" do >> i = 42 >> @q.sync {i = 1} >> i.should == 42 >> end >> >> But not in the README.rdoc for the dispatch module (aka >> dispatch_methods.rb sample): >> >> n = 0 >> job = Dispatch::Job.new { n = 21 } >> job.join >> puts "n (after): #{n} => 0?!?" # [returns 21, not 0] >> >> Any suggestions? >> >> -- >> Ticket URL: <http://www.macruby.org/trac/ticket/795> >> MacRuby <http://macruby.org/> >> >> _______________________________________________ >> MacRuby-devel mailing list >> MacRuby-devel@lists.macosforge.org >> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel > > _______________________________________________ > MacRuby-devel mailing list > MacRuby-devel@lists.macosforge.org > http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel