private method - Fixnum (NoMethodError)

S

salai

Dear All,

I can't find the error in my code. Can you explain me "private method
- Fixnum (NoMethodError)"?

Many thanks in advance,

koko

def subtotal(qty = 1)
return nil if self.to_f <= 0 || qty.to_f <= 0
self.to_f * qty.to_f
end

apple = 11

puts apple.subtotal(2)
 
J

John Barnette

Hi,

I can't find the error in my code. Can you explain me "private method
- =C2=A0Fixnum (NoMethodError)"?

def subtotal(qty =3D 1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0return nil if self.to_f <=3D 0 || qty.to_f <= =3D 0
=C2=A0 =C2=A0 =C2=A0 =C2=A0self.to_f * qty.to_f
end

apple =3D 11

puts apple.subtotal(2)

You've defined the 'subtotal' method in the global scope, which is
equivalent to defining a private instance method on Object. Private
methods can't be called with a receiver. If you really want to do this
(this method seems bizarre to me), you'll want to reopen one or more
of the numeric classes and define your method there, e.g.,

class Fixnum
def subtotal qty =3D 1
return nil if to_f <=3D 0 || qty.to_f <=3D 0
to_f * qty.to_f
end
end

apple =3D 11

puts apple.subtotal(2)
# 22.0


~ j.
 
S

Stefano Crocco

|Dear All,
|
|I can't find the error in my code. Can you explain me "private method
|- Fixnum (NoMethodError)"?
|
|Many thanks in advance,
|
|koko
|
|def subtotal(qty = 1)
| return nil if self.to_f <= 0 || qty.to_f <= 0
| self.to_f * qty.to_f
|end
|
|apple = 11
|
|puts apple.subtotal(2)

First of all, when you ask about an error, it's better to report the whole
error message, not just a bit of it. At any rate, running your code I get the
error message:

private method `subtotal' called for 11:Fixnum (NoMethodError)

this means that you're calling a private method in a forbidden way, that is
using the object.method_name notation. Private methods can only be called on
the explicit receiver (self). Now you may be asking, "why subtotal is a
private method?" The answer is that methods defined toplevel (that is, methods
which aren't defined inside a module or a class and aren't singleton methods)
automatically become private methods of class Object, so you can't call them
with an explicit receiver.

You have at least two options to fix your code, depending on what exactly you
need. You can:
1) define your subtotal method like this:
def subtotal( arg1, qty=1)
return nil if arg1.to_f <= 0 || qty.to_f <= 0
arg1.to_f * qty.to_f
end

and transform apple from the explicit receiver of the call to the first
argument to subtotal:

puts subtotal(apple, 2)

2) define the subtotal method in a class. For example, you can define it for
the Fixnum class:

class Fixnum
def subtotal(qty = 1)
return nil if self.to_f <= 0 || qty.to_f <= 0
self.to_f * qty.to_f
end
end

then you can call it as you originally did:
puts apple.subtotal(2)

I hope this helps

Stefano
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,152
Members
46,698
Latest member
LydiaHalle

Latest Threads

Top