From: Ezra Zygmuntowicz Date: 2006-10-19T10:12:16+09:00 Subject: Re: whats this lambda code doing? On Oct 18, 2006, at 6:02 PM, David Vallner wrote: > Ezra Zygmuntowicz wrote: >> klasses.inject(block) do |blk, klass| >> lambda { klass.with_scope(scope_hash, &blk) } >> end.call >> >> That outer block that ends on end returns the lambda made inside >> of that >> block. So end.call ends up being lambda { klass.with_scope >> (scope_hash, >> &blk) }.call >> > > Hmm. Unless I'm very mistaken, it would also only call the lambda for > the last object in klasses, generating several garbage (and relatively > expensive) lambdas. Boggle. Am I missing something? > > David Vallner > It looks like it would only call the last lambda but it does call all of them. Here is a simplification of whats happening. irb(main):065:0> def scoper(klasses=[:foo, :bar, :baz], &block) irb(main):066:1> klasses.inject(block) do |blk, klass| irb(main):067:2* lambda { puts klass; blk.call} irb(main):068:2> end.call irb(main):069:1> end => nil irb(main):070:0* scoper { puts '&block called' } baz bar foo &block called => nil irb(main):071:0> -- Ezra Zygmuntowicz -- Lead Rails Evangelist -- ez@engineyard.com -- Engine Yard, Serious Rails Hosting -- (866) 518-YARD (9273)