You have to use a predefined function if you want to pass a block,
e.g,
class A
def new_method1(somep, opts={}, *args, &block)
p opts
end
private
def _foo(somep, opts={}, *args, &block)
p opts
end
public
define_method(:new_method2, instance_method(:_foo))
end
Also, you can’t pass an optional argument to a block, you’d have to
write something like…
class A
define_method(:new_method3) { |somep, *args|
opts = {}
if args.length > 0 && args[0].class == Hash
opts = args[0]
end
p opts
}
end
Isn’t that dangerous in case new_method is called like:
a.new_method(“a”, other, args)
…where the optional ‘option’ arg is left out? It seems that your
version would consume the ‘other’ operand in that case. I think you’d
need to do something like I posted above to be safe.
Isn’t that dangerous in case new_method is called like:
a.new_method(“a”, other, args)
…where the optional ‘option’ arg is left out? It seems that your
version would consume the ‘other’ operand in that case. I think you’d
need to do something like I posted above to be safe.
Your question implies to me that you think that if I define a method
like this:
def foo( name, age=0, weight=170 )
…
end
that I can then call it like this:
foo( “Gavin”, 175 ) # use default age.
In case I’m properly understanding you, then you should know that you
cannot do that. You can’t ‘skip’ an optional argument and have other
optional or non-optional arguments later. So, by definition, the
‘other’ you use in your example is necessarily the second parameter to
the method, and thus satisfies the OPs desired functionality.