Why there is not "replace" method for Fixnum?

Hi, using String#replace I can "simulate" a pointer (thanks to David A. for
the explanation):

  a = "orignal a value"
  b = a
  b = "new value"
  a
  => "original a value"
  b
  => "new value"

This is obvious: after the new assigment of "b" it points to a different
object.

So I can use "replace":

  a = "orignal a value"
  b = a
  b.replace "new value"
  a
  => "new value"
  b
  => "new value"

But Fixnum has not this method "replace", neither Float. Doesn't make sense
any primitive Ruby Class having this "replace" method instead of just one of
them?

···

--
Iñaki Baz Castillo

Iñaki Baz Castillo wrote:

But Fixnum has not this method "replace", neither Float.

Consider this:
a = 5
b = 5
a.object_id == b.object_id #=> true

So a and b point to the same object even if there was no "a = b" anywhere.
That is because in ruby there is only one single instance of any integer, so
two variables pointing to 5 always point to the same object. This is because
of performance. As a consequence of this something like 5.replace 6 would
change *all* occurences of 5 to 6 which clearly would not be the desired
behaviour. So there is no Integer#replace.

HTH,
Sebastian

···

--
NP: Depeche Mode - Shake The Disease
Jabber: sepp2k@jabber.org
ICQ: 205544826

Strings are mutable. Neither Fixnum or Float are; they are immediates.
Which means that you can alter the content of a String object, because
it's actually a pointer to data, while a Fixnum object *is* its
content itself. This is done for performance I think.

···

On Sat, May 3, 2008 at 12:39 PM, Iñaki Baz Castillo <ibc@aliax.net> wrote:

Hi, using String#replace I can "simulate" a pointer (thanks to David A. for
the explanation):

  a = "orignal a value"
  b = a
  b = "new value"
  a
  => "original a value"
  b
  => "new value"

This is obvious: after the new assigment of "b" it points to a different
object.

So I can use "replace":

  a = "orignal a value"
  b = a
  b.replace "new value"
  a
  => "new value"
  b
  => "new value"

But Fixnum has not this method "replace", neither Float. Doesn't make sense
any primitive Ruby Class having this "replace" method instead of just one of
them?

--
Gerardo Santana

The short answer is NO!, let's look more carefully at what's happening
to see why.

a = "original object value"
# This binds the variable a to a string object. The identity of the
# string object can be obtained using the object_id method

a.object_id # => 63930

b = a

# This binds b to the identical object to which a is currently bound so:

b.object_id # => 63930

b = "new value"
# We've now bound b to a different object.
b.object_id # => 63360
b # => "new value"

# But a is still bound to the first object
a.object_id # => 63930

# Now we re-bind b to the original object
b = a
b.object_id # => 63930
b # => "original object value"

# And send replace to that object.
b.replace("new value")
b.object_id # => 63930
b # => "new value"
a.object_id # => 63930
a # => "new value"

# Two points. First, methods (like object_id, and replace) operate on
objects, NOT variables.
# Second, the replace method causes the string to change its contents,
NOT its identity. Some Ruby
# objects are mutable, they have methods which can alter their state,
other objects are immutable, once
# created they can't be changed.

a = "a new value"
b = "a new value"
a.object_id # => 60490
b.object_id # => 60420

# This illustrates that two strings with the same contents, aren't
necessarily the same object.
a == b # => true
a.equal?(b) # => false

# The == method compares state, equal? compares identity.

# Some objects, such as Fixnums, Symbols, nil, true, and false have
only one instance for a
# particular state.

a = 1
b = 1
a.object_id # => 3
b.object_id # => 3

Such objects certainly need to be immutable. If there's only one
instance of the fixnum 42, then you really wouldn't want to change its
value to say 43, or life, the universe, and everything would lose
their meaning.

···

On Sat, May 3, 2008 at 1:39 PM, Iñaki Baz Castillo <ibc@aliax.net> wrote:

Hi, using String#replace I can "simulate" a pointer (thanks to David A. for
the explanation):

  a = "orignal a value"
  b = a
  b = "new value"
  a
  => "original a value"
  b
  => "new value"

This is obvious: after the new assigment of "b" it points to a different
object.

So I can use "replace":

  a = "orignal a value"
  b = a
  b.replace "new value"
  a
  => "new value"
  b
  => "new value"

But Fixnum has not this method "replace", neither Float. Doesn't make sense
any primitive Ruby Class having this "replace" method instead of just one of
them?

-----
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

Opss, aewsome! I couldn't imagine it.

Thanks a lot for the explanation :slight_smile:

···

El Sábado, 3 de Mayo de 2008, Sebastian Hungerecker escribió:

Iñaki Baz Castillo wrote:
> But Fixnum has not this method "replace", neither Float.

Consider this:
a = 5
b = 5
a.object_id == b.object_id #=> true

So a and b point to the same object even if there was no "a = b" anywhere.
That is because in ruby there is only one single instance of any integer,
so two variables pointing to 5 always point to the same object. This is
because of performance. As a consequence of this something like 5.replace 6
would change *all* occurences of 5 to 6 which clearly would not be the
desired behaviour. So there is no Integer#replace.

--
Iñaki Baz Castillo

I hope explanations like this would appear in some Ruby manual and so :slight_smile:

···

El Sábado, 3 de Mayo de 2008, Rick DeNatale escribió:

The short answer is NO!, let's look more carefully at what's happening
to see why.

a = "original object value"
# This binds the variable a to a string object. The identity of the
# string object can be obtained using the object_id method

a.object_id # => 63930

b = a

# This binds b to the identical object to which a is currently bound so:

b.object_id # => 63930

b = "new value"
# We've now bound b to a different object.
b.object_id # => 63360
b # => "new value"

# But a is still bound to the first object
a.object_id # => 63930

# Now we re-bind b to the original object
b = a
b.object_id # => 63930
b # => "original object value"

# And send replace to that object.
b.replace("new value")
b.object_id # => 63930
b # => "new value"
a.object_id # => 63930
a # => "new value"

# Two points. First, methods (like object_id, and replace) operate on
objects, NOT variables.
# Second, the replace method causes the string to change its contents,
NOT its identity. Some Ruby
# objects are mutable, they have methods which can alter their state,
other objects are immutable, once
# created they can't be changed.

a = "a new value"
b = "a new value"
a.object_id # => 60490
b.object_id # => 60420

# This illustrates that two strings with the same contents, aren't
necessarily the same object.
a == b # => true
a.equal?(b) # => false

# The == method compares state, equal? compares identity.

# Some objects, such as Fixnums, Symbols, nil, true, and false have
only one instance for a
# particular state.

a = 1
b = 1
a.object_id # => 3
b.object_id # => 3

Such objects certainly need to be immutable. If there's only one
instance of the fixnum 42, then you really wouldn't want to change its
value to say 43, or life, the universe, and everything would lose
their meaning.

--
Iñaki Baz Castillo

What about the Fixnum class documentation:

http://www.ruby-doc.org/core/classes/Fixnum.html

"Fixnum objects have immediate value. This means that when they are
assigned or passed as parameters, the actual object is passed, rather
than a reference to that object. Assignment does not alias Fixnum
objects. There is effectively only one Fixnum object instance for any
given integer value, so, for example, you cannot add a singleton
method to a Fixnum."

···

On Sat, May 3, 2008 at 1:41 PM, Iñaki Baz Castillo <ibc@aliax.net> wrote:

El Sábado, 3 de Mayo de 2008, Rick DeNatale escribió:

> The short answer is NO!, let's look more carefully at what's happening
> to see why.
>
> a = "original object value"
> # This binds the variable a to a string object. The identity of the
> # string object can be obtained using the object_id method
>
> a.object_id # => 63930
>
> b = a
>
> # This binds b to the identical object to which a is currently bound so:
>
> b.object_id # => 63930
>
> b = "new value"
> # We've now bound b to a different object.
> b.object_id # => 63360
> b # => "new value"
>
> # But a is still bound to the first object
> a.object_id # => 63930
>
> # Now we re-bind b to the original object
> b = a
> b.object_id # => 63930
> b # => "original object value"
>
> # And send replace to that object.
> b.replace("new value")
> b.object_id # => 63930
> b # => "new value"
> a.object_id # => 63930
> a # => "new value"
>
> # Two points. First, methods (like object_id, and replace) operate on
> objects, NOT variables.
> # Second, the replace method causes the string to change its contents,
> NOT its identity. Some Ruby
> # objects are mutable, they have methods which can alter their state,
> other objects are immutable, once
> # created they can't be changed.
>
> a = "a new value"
> b = "a new value"
> a.object_id # => 60490
> b.object_id # => 60420
>
> # This illustrates that two strings with the same contents, aren't
> necessarily the same object.
> a == b # => true
> a.equal?(b) # => false
>
> # The == method compares state, equal? compares identity.
>
> # Some objects, such as Fixnums, Symbols, nil, true, and false have
> only one instance for a
> # particular state.
>
> a = 1
> b = 1
> a.object_id # => 3
> b.object_id # => 3
>
> Such objects certainly need to be immutable. If there's only one
> instance of the fixnum 42, then you really wouldn't want to change its
> value to say 43, or life, the universe, and everything would lose
> their meaning.

I hope explanations like this would appear in some Ruby manual and so :slight_smile:

--
Gerardo Santana

Yes, you are completely right :slight_smile:

But anyway, I think no newbie will read the doc of a integer since probably a
newbie will no realize of the class nature of a integer in Ruby, completely
different of any other language.
That's wahy I suggested to explain all this stuf in a Ruby manual instead of
core doc.

Regards.

···

El Sábado, 3 de Mayo de 2008, Gerardo Santana Gómez Garrido escribió:

> I hope explanations like this would appear in some Ruby manual and so :slight_smile:

What about the Fixnum class documentation:

http://www.ruby-doc.org/core/classes/Fixnum.html

"Fixnum objects have immediate value. This means that when they are
assigned or passed as parameters, the actual object is passed, rather
than a reference to that object. Assignment does not alias Fixnum
objects. There is effectively only one Fixnum object instance for any
given integer value, so, for example, you cannot add a singleton
method to a Fixnum."

--
Iñaki Baz Castillo

Most of the popular expositions of Ruby ("Programming Ruby" a.k.a. the
pickaxe, "Ruby for Rails", "The Ruby Programming language", e.g.) do
explain this.

Blogs are also a good source, may I have the temerity to suggest a
couple of articles germane to Ruby objects and variables:

http://talklikeaduck.denhaven2.com/articles/2006/09/13/on-variables-values-and-objects
http://talklikeaduck.denhaven2.com/articles/2008/02/08/whose-variable-is-it-anyway

···

On Sat, May 3, 2008 at 3:01 PM, Iñaki Baz Castillo <ibc@aliax.net> wrote:

El Sábado, 3 de Mayo de 2008, Gerardo Santana Gómez Garrido escribió:

> > I hope explanations like this would appear in some Ruby manual and so :slight_smile:
>
> What about the Fixnum class documentation:
>
> http://www.ruby-doc.org/core/classes/Fixnum.html
>
> "Fixnum objects have immediate value. This means that when they are
> assigned or passed as parameters, the actual object is passed, rather
> than a reference to that object. Assignment does not alias Fixnum
> objects. There is effectively only one Fixnum object instance for any
> given integer value, so, for example, you cannot add a singleton
> method to a Fixnum."

Yes, you are completely right :slight_smile:

But anyway, I think no newbie will read the doc of a integer since probably a
newbie will no realize of the class nature of a integer in Ruby, completely
different of any other language.
That's wahy I suggested to explain all this stuf in a Ruby manual instead of
core doc.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

Sure great articles, Ill read them :slight_smile:

···

El Sábado, 3 de Mayo de 2008, Rick DeNatale escribió:

Most of the popular expositions of Ruby ("Programming Ruby" a.k.a. the
pickaxe, "Ruby for Rails", "The Ruby Programming language", e.g.) do
explain this.

Blogs are also a good source, may I have the temerity to suggest a
couple of articles germane to Ruby objects and variables:

http://talklikeaduck.denhaven2.com/articles/2006/09/13/on-variables-values-
and-objects
http://talklikeaduck.denhaven2.com/articles/2008/02/08/whose-variable-is-it
-anyway

--
Iñaki Baz Castillo