Thanks you very much to you all.


regards,
salai.

On Wed, Jun 17, 2009 at 6:33 PM, Stefano Crocco<stefano.crocco / alice.it> wr=
ote:
> On Wednesday 17 June 2009, salai wrote:
>> |Dear All,
>> |
>> |I can't find the error in my code. Can you explain me "private method
>> |- =A0Fixnum (NoMethodError)"?
>> |
>> |Many thanks in advance,
>> |
>> |koko
>> |
>> |def subtotal(qty =3D 1)
>> | =A0 =A0 return nil if self.to_f <=3D 0 || qty.to_f <=3D 0
>> | =A0 =A0 self.to_f * qty.to_f
>> |end
>> |
>> |apple =3D 11
>> |
>> |puts apple.subtotal(2)
>
> First of all, when you ask about an error, it's better to report the whol=
e
> 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, me=
thods
> which aren't defined inside a module or a class and aren't singleton meth=
ods)
> automatically become private methods of class Object, so you can't call t=
hem
> 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:
> =A0def subtotal( arg1, qty=3D1)
> =A0 =A0return nil if arg1.to_f <=3D 0 || qty.to_f <=3D 0
> =A0 =A0arg1.to_f * qty.to_f
> =A0end
>
> and transform apple from the explicit receiver of the call to the first
> argument to subtotal:
>
> =A0puts subtotal(apple, 2)
>
> 2) define the subtotal method in a class. For example, you can define it =
for
> the Fixnum class:
>
> =A0class Fixnum
> =A0 =A0def subtotal(qty =3D 1)
> =A0 =A0 =A0return nil if self.to_f <=3D 0 || qty.to_f <=3D 0
> =A0 =A0 =A0 self.to_f * qty.to_f
> =A0 =A0end
> =A0end
>
> =A0then you can call it as you originally did:
> =A0puts apple.subtotal(2)
>
> I hope this helps
>
> Stefano
>
>