# Calling a method with an instance

**URL:** <https://www.ruby-forum.com/t/calling-a-method-with-an-instance/196032>\
**Category:** Ruby\
**Created:** [October 5, 2010, 8:59pm UTC](https://www.ruby-forum.com/t/calling-a-method-with-an-instance/196032 "2010-10-05T20:59:09Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![prichard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/90db22/32.png) [@prichard](https://www.ruby-forum.com/u/prichard)\
**Post date:** [October 5, 2010, 8:59pm UTC](https://www.ruby-forum.com/t/calling-a-method-with-an-instance/196032/1 "2010-10-05T20:59:09Z")

</div>

Hi. I’m playing around with creating methods and then creating an  
instance that calls the instance. Here’s my code…

class Discount  
attr\_accessor :amount, :discount

def initialize(am, dis)  
@amount = am  
@discount = dis

end

def self.discount\_amount(amt, disc)  
newamount = amt - disc  
end

end

dis1 = Discount.new(100, 20)

dis1.discount\_amount(amount, discount)

The error I get is…

discount.rb:25:in `<main>': undefined local variable or method`amount’  
for main  
:Object (NameError)

What is the best way to call a method with an instance?  
Thanks

---

<div class="post-metadata">

**Author:** ![prichard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/90db22/32.png) [@prichard](https://www.ruby-forum.com/u/prichard)\
**Post date:** [October 5, 2010, 9:26pm UTC](https://www.ruby-forum.com/t/calling-a-method-with-an-instance/196032/2 "2010-10-05T21:26:49Z")

</div>

On Oct 5, 2:59 pm, Paul R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> end
> 
> The error I get is…
> 
> discount.rb:25:in `<main>': undefined local variable or method `amount’  
> for main  
> :Object (NameError)
> 
> ## What is the best way to call a method with an instance? Thanks
> 
> Posted viahttp://www.ruby-forum.com/.

I think u want:  
dis1.discount\_amount(dis1.amount, discount)

---

<div class="post-metadata">

**Author:** ![prichard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/90db22/32.png) [@prichard](https://www.ruby-forum.com/u/prichard)\
**Post date:** [October 5, 2010, 9:27pm UTC](https://www.ruby-forum.com/t/calling-a-method-with-an-instance/196032/3 "2010-10-05T21:27:24Z")

</div>

On Oct 5, 3:20 pm, Jedrin [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > def initialize(am, dis)
> 
> > ## What is the best way to call a method with an instance? Thanks
> > 
> > Posted viahttp://www.ruby-forum.com/.
> 
> I think u want:  
> dis1.discount\_amount(dis1.amount, discount)

this works, but not sure if this approach is most sensible

dis1.discount\_amount(dis1.amount, dis1.discount)

---

<div class="post-metadata">

**Author:** ![prichard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/90db22/32.png) [@prichard](https://www.ruby-forum.com/u/prichard)\
**Post date:** [October 5, 2010, 9:32pm UTC](https://www.ruby-forum.com/t/calling-a-method-with-an-instance/196032/4 "2010-10-05T21:32:06Z")

</div>

On 10/5/2010 1:59 PM, Paul R. wrote:

> dis1 = Discount.new(100, 20)
> 
> What is the best way to call a method with an instance?  
> Thanks

There are a couple issues. First of all, you are trying to use two  
variables (amount and discount) without giving them any values, in other  
words without defining them. That’s why you get the error “undefined  
local variable or method `amount’”. Perhaps you mean to use dis1.amount  
and dis1.discount instead.

Once you clear that hurdle, you’ll find you also declared the  
discount\_amount method as a class method on Discount, not an instance  
method. However, you go on to call the method as an instance method of  
dis1. I think the corrected code would be as follows:

Discount.discount\_amount(dis1.amount, dis1.discount)

-Jeremy

---

<div class="post-metadata">

**Author:** ![prichard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/90db22/32.png) [@prichard](https://www.ruby-forum.com/u/prichard)\
**Post date:** [October 5, 2010, 9:35pm UTC](https://www.ruby-forum.com/t/calling-a-method-with-an-instance/196032/5 "2010-10-05T21:35:01Z")

</div>

Um, I think you guys mean  
Discount.discount\_amount(dis1.amount,dis1.discount)

discount\_amount is not an instance method. Or am I missing something?

---

<div class="post-metadata">

**Author:** ![prichard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/90db22/32.png) [@prichard](https://www.ruby-forum.com/u/prichard)\
**Post date:** [October 5, 2010, 9:32pm UTC](https://www.ruby-forum.com/t/calling-a-method-with-an-instance/196032/6 "2010-10-05T21:32:32Z")

</div>

Jedrin wrote:

> On Oct 5, 3:20ï¿½pm, Jedrin [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > > ï¿½def initialize(am, dis)
> > 
> > > ## What is the best way to call a method with an instance? Thanks
> > > 
> > > Posted viahttp://www.ruby-forum.com/.
> > 
> > I think u want:  
> > dis1.discount\_amount(dis1.amount, discount)
> 
> this works, but not sure if this approach is most sensible
> 
> dis1.discount\_amount(dis1.amount, dis1.discount)

Thanks for this. What is the best way to go about dealing with a method  
such as this that has two parameters?

---

<div class="post-metadata">

**Author:** ![prichard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/90db22/32.png) [@prichard](https://www.ruby-forum.com/u/prichard)\
**Post date:** [October 5, 2010, 9:53pm UTC](https://www.ruby-forum.com/t/calling-a-method-with-an-instance/196032/7 "2010-10-05T21:53:10Z")

</div>

On 10/5/2010 2:32 PM, Paul R. wrote:

> > > dis1.discount\_amount(dis1.amount, discount)
> > 
> > this works, but not sure if this approach is most sensible
> > 
> > dis1.discount\_amount(dis1.amount, dis1.discount)
> 
> Thanks for this. What is the best way to go about dealing with a method  
> such as this that has two parameters?

I think the comment about sensibility regards the passing of an object’s  
internal values to one of the object’s own methods. Assuming you  
redefine the discount\_amount method as an instance method, there is no  
need to pass in these values since they will be available to the method  
as @amount and @discount:

class Discount  
attr\_accessor :amount, :discount

def initialize(amount, discount)  
@amount = amount  
@discount = discount  
end

# defined discount\_amount as an instance method rather than a

# class method

def discount\_amount  
@amount - @discount  
end  
end

dis1 = Discount.new(100, 20)  
dis1.discount\_amount # =\> 80

-Jeremy
