On Oct 5, 2010, at 15:22 , Jeremy Bopp wrote:

> On 10/5/2010 5:00 PM, Paul Roche wrote:
>> Hi, I have a method...
>>=20
>> def  make_pay_loan
>>=20
>> end
>>=20
>> I want this method to 'activate' (for want of a better word) another
>> method called pay_loan.
>>=20
>> Any tips on how this could be done are welcome, thanks
>=20
> I think you want to dynamically define one method from within another.
> Try this:
>=20
> def make_pay_loan
>  def pay_loan
>    puts 'paid'
>  end
> end

But there is nothing dynamic about that solution. All you're doing is =
defining a def expression inside of another which will get defined the =
first time (and every time for that matter) make_pay_loan gets called. =
pay_loan is entirely static and has no ability to be dynamic in any way.

You'll want to use define_method or eval in order to actually be =
dynamic.

% echo "def make_pay_loan
>  def pay_loan
>    puts 'paid'
>  end
> end
> " | parse_tree_show
s(:defn, :make_pay_loan,
 s(:args),
 s(:scope,
  s(:block,
   s(:defn, :pay_loan,
    s(:args),
    s(:scope,
     s(:block, s(:call, nil, :puts, s(:arglist, s(:str, "paid")))))))))

Depending on how the OP means "activate", it could be as simple as =
calling public on the method to make it visible, or as complex as =
defining a dynamic method with define_method and using the closure to =
capture the dynamic values passed in to make_pay_loan.=