|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 (permalink) |
|
Messages: n/a
Hébergeur: |
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 nly_oneelse yield ne,:twoend } 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 |
|
|
|
#2 (permalink) |
|
Messages: n/a
Hébergeur: |
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 nly_one> else > yield ne,: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 |
|
|
|
#3 (permalink) |
|
Messages: n/a
Hébergeur: |
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 nly_oneelse yield ne,:twoend } end end It's not quite as simple as that but that should be enough to move you forward. T. |
|
|
|
#4 (permalink) |
|
Messages: n/a
Hébergeur: |
>
> 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 nly_one> else > yield ne,: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 |
|
|
|
#5 (permalink) |
|
Messages: n/a
Hébergeur: |
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 nly_oneelsif block.arity == 2 yield ne,:twoelsif block.arity == -2 yield ne, :a , :splater, :argumentend 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 nly_one> > else > > yield ne,: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 |
|
![]() |
| Outils de la discussion | |
|
|