[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

blocks expected arguments and metaprogramming

Pedro Del Gallego

9/16/2007 3:11:00 PM

hi all,

in this (http://pastie.cabo... ) 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 :(

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

4 Answers

Wilson Bilkovich

9/16/2007 4:56:00 PM

0

On 9/16/07, Pedro Del Gallego <pedro.delgallego@gmail.com> wrote:
> hi all,
>
> in this (http://pastie.cabo... ) 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 :(
>
> When are defined the variables of the block, in the class definition
> time, or after the yield call?
>

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

Trans

9/16/2007 5:00:00 PM

0



On Sep 16, 8:10 am, "Pedro Del Gallego" <pedro.delgall...@gmail.com>
wrote:
> hi all,
>
> in this (http://pastie.cabo...) 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.

T.


Pedro Del Gallego

9/16/2007 5:40:00 PM

0

>
> On Sep 16, 8:10 am, "Pedro Del Gallego" <pedro.delgall...@gmail.com>
> wrote:
> > hi all,
> >
> > in this (http://pastie.cabo...) 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

9/16/2007 6:07:00 PM

0

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.cabo...) 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