Blocks expected arguments and metaprogramming

hi all,

in this (http://pastie.caboo.se/97662 ) code :

module Kernel
  def expected_argument_list
    2
  end

  def before (name)
     puts :hola
     define_method(name){
       if expected_argument_list==1
        yield :only_one
       else
        yield :one,:two
       end
     }
  end
end

class A
  before :foo do |*args|
    puts second
  end

  before :foo do |first , second|
    puts second
  end
end

a = A.new
a.foo

Does anyone know of a way to determine what argument list was
specified when the block is created?

i mean i want to implement the function expected_argument_list, to
return the length of the argument list that the block expected.
Probably is not possible to do that :frowning:

When are defined the variables of the block, in the class definition
time, or after the yield call?

Thanks

···

--
-------------------------------------
Pedro Del Gallego

Email : pedro.delgallego@gmail.com

The block arguments are only known at runtime, since you could do this:
def example
  args =
  rand(15).times {|i| args << i}
  yield *args
end

···

On 9/16/07, Pedro Del Gallego <pedro.delgallego@gmail.com> wrote:

hi all,

in this (http://pastie.caboo.se/97662 ) code :

module Kernel
  def expected_argument_list
    2
  end

  def before (name)
     puts :hola
     define_method(name){
       if expected_argument_list==1
        yield :only_one
       else
        yield :one,:two
       end
     }
  end
end

class A
  before :foo do |*args|
    puts second
  end

  before :foo do |first , second|
    puts second
  end
end

a = A.new
a.foo

Does anyone know of a way to determine what argument list was
specified when the block is created?

i mean i want to implement the function expected_argument_list, to
return the length of the argument list that the block expected.
Probably is not possible to do that :frowning:

When are defined the variables of the block, in the class definition
time, or after the yield call?

def before (name, &blk)
      puts :hola
      define_method(name){
        if blk.arity==1
         yield :only_one
        else
         yield :one,:two
        end
      }
   end
end

It's not quite as simple as that but that should be enough to move you
forward.

T.

···

On Sep 16, 8:10 am, "Pedro Del Gallego" <pedro.delgall...@gmail.com> wrote:

hi all,

in this (http://pastie.caboo.se/97662\) code :

module Kernel
  def expected_argument_list
    2
  end

> hi all,
>
> in this (http://pastie.caboo.se/97662\) code :
>
> module Kernel
> def expected_argument_list
> 2
> end
>
   def before (name, &blk)
      puts :hola
      define_method(name){
        if blk.arity==1
         yield :only_one
        else
         yield :one,:two
        end
      }
   end
end

It's not quite as simple as that but that should be enough to move you
forward.

Yes thats enough for me. I didnt now that the block was a Proc class.

Thanks.

···

On Sep 16, 8:10 am, "Pedro Del Gallego" <pedro.delgall...@gmail.com> > wrote:

--
-------------------------------------
Pedro Del Gallego

Email : pedro.delgallego@gmail.com

BTW, its works perfectly, with that i can decide what parameter return
in advances, (but, yet, I dont know is a good idea or not)

Thanks

module Kernel
  def before (name, &block)
    define_method(name) do
      if block.arity == 1
        yield :only_one
      elsif block.arity == 2
        yield :one,:two
      elsif block.arity == -2
        yield :one, :a , :splater, :argument
      end
    end
  end
end

class A
  before :foo do |first|
    puts first
  end
end

a = A.new
a.foo

class A
  before :foo do |first , second|
    puts second
  end
end

a2 = A.new
a2.foo

class A
  before :foo do |first , *splat_arg|
    puts splat_arg
  end
end

a3 = A.new
a3.foo

···

2007/9/16, Pedro Del Gallego <pedro.delgallego@gmail.com>:

>
> On Sep 16, 8:10 am, "Pedro Del Gallego" <pedro.delgall...@gmail.com> > > wrote:
> > hi all,
> >
> > in this (http://pastie.caboo.se/97662\) code :
> >
> > module Kernel
> > def expected_argument_list
> > 2
> > end
> >
> def before (name, &blk)
> puts :hola
> define_method(name){
> if blk.arity==1
> yield :only_one
> else
> yield :one,:two
> end
> }
> end
> end
>
> It's not quite as simple as that but that should be enough to move you
> forward.

Yes thats enough for me. I didnt now that the block was a Proc class.

Thanks.

--
-------------------------------------
Pedro Del Gallego

Email : pedro.delgallego@gmail.com

--
-------------------------------------
Pedro Del Gallego

Email : pedro.delgallego@gmail.com