Some methods change objects in place, others return a changed object and lea=
ve the original in place.

 The bang is placed by convention at the end of methods that have some unusu=
al behavior; most often, this unusual behavior is that a data structure is p=
assed in by reference not by value.=20

On Sep 19, 2012, at 9:32 PM, ten ten <lists / ruby-forum.com> wrote:

> Hi all,
>=20
> Sorry, I deleted my previous post on the ruby forum by mistake.
> So I post it again.
>=20
>=20
>=20
> I am a Ruby-beginner.
> I have some experience of C/C++ for several years.
> It has been only one week since I started to learn Ruby.
> Please tell me about the behavior of iterator methods.
>=20
> At first, I did as bellow on the irb environment.
> -------------------------------------------------------
> irb(main):001:0> s =3D ["a", "b", "c"]
> =3D> ["a", "b", "c"]
> irb(main):002:0> s[0].object_id
> =3D> 36971304
> irb(main):003:0> s[1].object_id
> =3D> 36971292
> irb(main):004:0> s[2].object_id
> =3D> 36971280
> irb(main):005:0> s.each{|c| c.upcase!}
> =3D> ["A", "B", "C"]
> irb(main):006:0> p s
> ["A", "B", "C"]
> =3D> nil
> -------------------------------------------------------
>=20
> Looking at this, I thought I can change the value of each element in
> Array object through iterator methods.
>=20
> However, when I did next as bellow, that behavior looked different.
> -------------------------------------------------------
> irb(main):007:0> a =3D [1,2,3]
> =3D> [1, 2, 3]
> irb(main):008:0> a[0].object_id
> =3D> 3
> irb(main):009:0> a[1].object_id
> =3D> 5
> irb(main):010:0> a[2].object_id
> =3D> 7
> irb(main):011:0> a.each{|i| i +=3D 1}
> =3D> [1, 2, 3]
> irb(main):012:0> p a
> [1, 2, 3]
> =3D> nil
>=20
> irb(main):013:0> a.each{|i| p i.object_id}
> 3
> 5
> 7
> =3D> [1, 2, 3]
> -------------------------------------------------------
>=20
> I expected that Array#each method with the code block would change
> contents of the Array object variable named 'a' into [2,3,4].
> But it didn't. Why?
>=20
> The object IDs of a[0], a[1], a[2] are shown through
> the the code block of Array#each. So I thought if variable named 'i'
> changed its value, that had to be reflected to the Array object 'a'.
> But it didn't.
>=20
>=20
> Why did this difference happened?
>=20
> --=20
> Posted via http://www.ruby-forum.com/.
>=20