Blocks expected arguments and metaprogramming

hi all,

in this (Parked at Loopia ) 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 G.

Email : [email protected]

On Sep 16, 8:10 am, “Pedro Del G.” [email protected]
wrote:

hi all,

in this (Parked at Loopia) 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.

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 G.

Email : [email protected]

On 9/16/07, Pedro Del G. [email protected] wrote:

 puts :hola

class A
a.foo

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

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 G. [email protected]:

end
end


Pedro Del G.

Email : [email protected]

Pedro Del G.

Email : [email protected]