How to call a method within another method

Hi, I have a method...

def make_pay_loan

end

I want this method to 'activate' (for want of a better word) another
method called pay_loan.

Any tips on how this could be done are welcome, thanks

···

--
Posted via http://www.ruby-forum.com/.

I think you want to dynamically define one method from within another.
Try this:

def make_pay_loan
  def pay_loan
    puts 'paid'
  end
end

# Calling pay_loan here will cause an error since the method is
# not yet defined.
#pay_loan

# This will define the pay_loan method.
make_pay_loan

# This outputs "paid". :slight_smile:
pay_loan

-Jeremy

···

On 10/5/2010 5:00 PM, Paul Roche wrote:

Hi, I have a method...

def make_pay_loan

end

I want this method to 'activate' (for want of a better word) another
method called pay_loan.

Any tips on how this could be done are welcome, thanks

Hi, I have a method...

def make_pay_loan

end

I want this method to 'activate' (for want of a better word) another
method called pay_loan.

Any tips on how this could be done are welcome, thanks

I think you want to dynamically define one method from within another.
Try this:

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.

···

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

def make_pay_loan

end

I want this method to 'activate' (for want of a better word) another
method called pay_loan.

Any tips on how this could be done are welcome, thanks

I think you want to dynamically define one method from within another.
Try this:

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.

All I'm doing is attempting to answer the question as asked without
adding too much at once for a new user for whom this might appear quite
dynamic. The terminology will sort itself out in time. :slight_smile:

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

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.

You're correct that define_method and eval are able to create truly
dynamic definitions and that "activate" can have other interpretations;
however, I don't believe that being overly pedantic is particularly
helpful in this case. If you have a better answer to the OP's question,
please provide it, even if it's just asking for clarification. :wink:

-Jeremy

···

On 10/05/2010 09:53 PM, Ryan Davis wrote:

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

On 10/5/2010 5:00 PM, Paul Roche wrote: