Hi all,

Ruby does not support named parameter for now as all of you know.
There is really three solutions for this
* hash as parameter
* class as parameter
* bindings

Hash parameters:

def do_some( params )
  a = params[ :a ]
  b = params[ :b ]
end

do_some :a => 1, :b =>2

Class parameters (ugly, written in couple minutes)

class A
    def metaclass
        class << self; self; end
    end

    def set_var( name, val )
        eval "@#{name} = val", binding
        self.metaclass.send( :define_method, name ) do
            eval "@#{name}"
        end
    end
    def set_vars( params )
        params.each{ |key,val| self.set_var( key, val ) }
    end
end


def do_some( params )
 a = params.a
 b = params.b
end

A.new
a.set_vars( :a => 1. :b =>2 )
do_some a

Bindings way:

def do_block( &block )
   eval "a=1", block.binding
   eval "b=2", block.binding
end

do_block( params ){
  a = eval 'a'
  b = eval 'b'
}


As we can see there is overtyping in all cases. We always need to map
incoming variables into locals or write ugly accessor every time.

So My question is:
   Is there any way to set local variables for blocks outside of block
scope?

IMHO nice solution will looks like this:
def do_some( &block )
  block.binding.set_var( 'a', 1 )
  block.binding.set_var( 'b', 2 )
  block.call
end

do_some{
   puts a
   puts b
}