Kazuyoshi T. wrote:
I got it, I go it, I got it!!!
def change str
str.replace ‘…’
end
str = ‘.’
change str
puts str
#=> …
yey!
(Hey guys, I realize this thread is a month old, but its relevant to
something I’m doing right now.)
Wow, this is the first time I’ve been disappointed by Ruby. This seems
to me to be a very poor choice. This (real code)…
string = ‘a string’
copy = string
string.replace ‘a different string’
…seems a very poor substitute for this (pseudocode), which I would
expect to have the same result…
string = ‘a string’
copy = *string
string = ‘a different string’
…because the real code requires the changer of the string to know that
there is going to be a copy made of the string. Here’s a more realistic
example (assume Person is a class that allows new instance variables to
be created at runtime; in fact, I have completely implemented such a
Person class and the irb I/O shown is completely real):
irb> p = Person.new
=> #<Person:0x2bc43d0 @field_list=[:first_name, :last_name,
:middle_name, :location, :primary_email, :primary_phone_number]>
irb> p.personal_email = ‘[email protected]’
=> “[email protected]”
irb> p
=> #<Person:0x2bc43d0 @personal_email=“[email protected]”,
@field_list=[:first_name, :last_name, :middle_name, :location,
:primary_email, :primary_phone_number, :personal_email]>
irb> p.primary_email = p.personal_email
=> “[email protected]”
irb> p
=> #<Person:0x2bc43d0 @personal_email=“[email protected]”,
@primary_email=“[email protected]”, @field_list=[:first_name, :last_name,
:middle_name, :location, :primary_email, :primary_phone_number,
:personal_email]>
irb> p.personal_email.replace ‘[email protected]’
=> “[email protected]”
irb> p
=> #<Person:0x2bc43d0 @personal_email=“[email protected]”,
@primary_email=“[email protected]”, @field_list=[:first_name, :last_name,
:middle_name, :location, :primary_email, :primary_phone_number,
:personal_email]>
Is there really no way to do this such that the line
“p.personal_email.replace ‘[email protected]’” can be replaced with
“p.personal_email = ‘[email protected]’” and both strings will be modified?
I think that’s terrible–obviously, it’s pretty realistic to expect that
code like this would occur, but making it possible it requires every
piece of code that changes p.personal_email to know that there is or
could be a copy of it made. It makes String.= virtually useless,
because in order to make it possible for a user to create a new String
that always reflects the contents of another String, one must always use
String.replace instead of String.= to assign values to Strings. It
seems like the best solution would simply be to add an =* operator (to
Object itself, ideally) such that this would be possible, in place of
the line “p.primary_email = p.personal_email” above:
p.primary_email =* p.personal_email #p.primary_email now contains a
pointer directly to p.personal_email instead of containing a pointer to
the same object that p.personal_email points to
Of course, that is easier said than done, but I can’t think of any other
solution that comes close to being as elegant.
Am I missing something? Is there already a way to create pointers to
pointers in Ruby so that this problem can be avoided?
Thanks,
Doug