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 rob@flowof.info E-Mail On 15 Jul 2010, at 21:47, MacRuby wrote:
#795: GCD inconsistently copies local variables inside blocks ----------------------------------------+----------------------------------- Reporter: ernest.prabhakar@… | Owner: lsansonetti@… 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