99.respond_to? :dup ==> true

R

Ruby Rabbit

I have values of various datatypes coming into this method and the
method does a dup, since it modifies the values and obviously does not
want to change the original.

However, Fixnum's do respond to :dup but give an error when called.
First off, can someone explain this to me.
Second, i have worked around it with a "rescue" clause.

In future, should I avoid using "respond_to?" since it could cause
errors. Should I always use rescue.
I now have:

value = value.dup rescue value
 
G

Gennady Bystritsky

2 points here (and sorry for the top posting -- my web mail client does not=
quote properly):

1. It may be the case that if an object is not dup()-able, you better not q=
uietly continue with an original object as modifying it may cause undesired=
side effects. In this case, an exception from calling dup(), either NoMeth=
odError or TypeError (can't dup Fixnum), is a valid reason to report a dat=
atype error.

2. Instead of dup()-ing, you may consider using a proxy class that will del=
egate to the original object, yet keeping track of all modifications. It wi=
ll work even for data types that do not support dup().=20

Best,
Gennady.
________________________________________
From: (e-mail address removed) [[email protected]]
Sent: Monday, January 12, 2009 23:06
To: ruby-talk ML
Subject: 99.respond_to? :dup =3D=3D> true

I have values of various datatypes coming into this method and the
method does a dup, since it modifies the values and obviously does not
want to change the original.

However, Fixnum's do respond to :dup but give an error when called.
First off, can someone explain this to me.
Second, i have worked around it with a "rescue" clause.

In future, should I avoid using "respond_to?" since it could cause
errors. Should I always use rescue.
I now have:

value =3D value.dup rescue value
 
R

Ruby Rabbit

Gennady said:
2 points here (and sorry for the top posting -- my web mail client does
not quote properly):

1. It may be the case that if an object is not dup()-able, you better
not quietly continue with an original object as modifying it may cause
undesired side effects. In this case, an exception from calling dup(),
either NoMethodError or TypeError (can't dup Fixnum), is a valid reason
to report a datatype error.

2. Instead of dup()-ing, you may consider using a proxy class that will
delegate to the original object, yet keeping track of all modifications.
It will work even for data types that do not support dup().

Best,
Gennady.
________________________________________

Ouch! Your web client has exposed my email id to the spammers :-(
Anyway,.... no, here i do not want the original value touched since the
user may press Escape and abandon editing.

In the case of numbers and floats, usually its a call by value so a copy
is made anyway.

Anyway, as a newbie, it was quite a surprise - i've relied on
respond_to? to take care of a lot of generic code.

thx.
 
G

Gennady Bystritsky

First of all, it is not my web mail client to blame (it has lots of its own=
faults) -- if your e-mail were not present in the original message no clie=
nt would be able to expose it in reply anyway ;-).

As had been mentioned many times on this list (in one form or another), res=
pond_to? is a lame duck of the duck typing world ;-). It only can indicate =
that an object has a method in its inheritance chain to invoke in response =
to a named message. I has no idea -- and can't have any, really -- what tha=
t method would do for you and even how to properly invoke it.=20

Getting back to dup(), this method is defined for Object class, so every Ru=
by object, including Fixnum instances, will inherit it. On the other hand, =
there's nothing to dup() for Fixnum -- hence method redefinition to raise a=
TypeError. =20

Gennady.
________________________________________
From: (e-mail address removed) [[email protected]]
Sent: Monday, January 12, 2009 23:43
To: ruby-talk ML
Subject: Re: 99.respond_to? :dup =3D=3D> true

Gennady said:
2 points here (and sorry for the top posting -- my web mail client does
not quote properly):

1. It may be the case that if an object is not dup()-able, you better
not quietly continue with an original object as modifying it may cause
undesired side effects. In this case, an exception from calling dup(),
either NoMethodError or TypeError (can't dup Fixnum), is a valid reason
to report a datatype error.

2. Instead of dup()-ing, you may consider using a proxy class that will
delegate to the original object, yet keeping track of all modifications.
It will work even for data types that do not support dup().

Best,
Gennady.
________________________________________

Ouch! Your web client has exposed my email id to the spammers :-(
Anyway,.... no, here i do not want the original value touched since the
user may press Escape and abandon editing.

In the case of numbers and floats, usually its a call by value so a copy
is made anyway.

Anyway, as a newbie, it was quite a surprise - i've relied on
respond_to? to take care of a lot of generic code.

thx.
 
R

Ruby Rabbit

Gennady said:
First of all, it is not my web mail client to blame (it has lots of its
own faults) -- if your e-mail were not present in the original message
no client would be able to expose it in reply anyway ;-).

Haha, the spam has begun !!!! I guess I'll have to move to a gmail
account i/o gmx.
 

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

No members online now.

Forum statistics

Threads
473,763
Messages
2,569,563
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top