# Array question - How dynamic is dynamic?

**URL:** <https://www.ruby-forum.com/t/array-question-how-dynamic-is-dynamic/164927>\
**Category:** Ruby\
**Created:** [April 7, 2009, 2:52pm UTC](https://www.ruby-forum.com/t/array-question-how-dynamic-is-dynamic/164927 "2009-04-07T14:52:15Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![rubina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e47c2d/32.png) [@rubina](https://www.ruby-forum.com/u/rubina)\
**Post date:** [April 7, 2009, 2:52pm UTC](https://www.ruby-forum.com/t/array-question-how-dynamic-is-dynamic/164927/1 "2009-04-07T14:52:15Z")

</div>

Hello all you happy people!

I have been thinking about asking this question but did not know how to  
start.  
So, if my question is ambiguous please let me know and I will try to  
make it  
clearer.

Given an NxN array or even an NxM array mA from which at times I break  
it  
into sub arrays, I would like to be able to manipulate the sub arrays  
and  
have the changes dynamically propagated to the main array mA.  
For example, assume I have main array mA as listed below.  
From mA I strip say row[2], which I named sAr2 and which has values:  
sAr2 =  
[D, C, B, A]  
I also created sub arrays of columns, as listed below and furthermore, I  
created quadrants sub arrays.

I would like to make a change on any of the sub arrays and have that  
change  
propagated simultaneously to the main array.  
For instance, say I set sAr2[1] = Y, I would like element mA[2,1] to  
change  
to Y from C.  
The same should happen if and when I change any of the sub arrays.  
The same should happen if and when I change the main array.

Is this possible say in 1.9.1? or do I need some kind of GEM?

Main Array:

mA = [  
[A, B, C, D],  
[B, A, C, D],  
[D, C, B, A],  
[C, A, D, B]  
]

Sub Arrays:  
sAr0 (sub array row 0 to row n, where n is 3 for this case)  
sAr0 = [A, B, C, D]  
sAr1 = [B, A, C, D]  
sAr2 = [D, C, B, A]  
sAr3 = [C, A, D, B]

sAc0 (sub array column 0 to column n, where n is 3 for this case)  
sAc0 = [A, B, D, C]  
sAc1 = [B, A, C, A]  
sAc2 = [C, C, B, D]  
sAc3 = [D, D, A, B]  
Four “quadrants?” arrays as follows:  
qA1:  
[[A, B  
B, A]]

qA3:  
[[B, D A, B]]

Etc.

Thank you

---

<div class="post-metadata">

**Author:** ![rubina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e47c2d/32.png) [@rubina](https://www.ruby-forum.com/u/rubina)\
**Post date:** [April 7, 2009, 3:37pm UTC](https://www.ruby-forum.com/t/array-question-how-dynamic-is-dynamic/164927/2 "2009-04-07T15:37:31Z")

</div>

On Tue, Apr 7, 2009 at 2:50 PM, Ruby S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> For example, assume I have main array mA as listed below.  
> From mA I strip say row[2], which I named sAr2 and which has values: sAr2 =  
> [D, C, B, A]  
> I also created sub arrays of columns, as listed below and furthermore, I  
> created quadrants sub arrays.
> 
> I would like to make a change on any of the sub arrays and have that change  
> propagated simultaneously to the main array.  
> For instance, say I set sAr2[1] = Y, I would like element mA[2,1] to change  
> to Y from C.

First thing that came to mind is to add a level of indirection, so  
that the array doesn’t  
contain the actual values, but an object that contains the values, like  
so:

irb(main):001:0\> O = Struct.new :value  
=\> O  
irb(main):008:0\> A = “A”  
=\> “A”  
irb(main):009:0\> B = “B”  
=\> “B”  
irb(main):010:0\> C = “C”  
=\> “C”  
irb(main):013:0\> myAr = [[O.new(A), O.new(B), O.new(C)],[O.new(B),  
O.new(A), O.new(C)],[O.new(C), O.new(B), O.new(A)]]  
=\> [[#, #, #], [#, #, #], [#, #, #]]  
irb(main):017:0\> first\_row = myAr[0]  
=\> [#, #, #]  
irb(main):018:0\> Y = “Y”  
=\> “Y”  
irb(main):019:0\> first\_row[2].value = Y  
=\> “Y”  
irb(main):020:0\> myAr  
=\> [[#, #, #], [#, #, #], [#, #, #]]

So by changing the value of the object pointed to by first\_row[0], you  
are really changing the same object that is referenced in the original  
array. Don’t know if this is convenient for you or not. Probably  
someone will come up with a better idea.

Hope this helps,

Jesus.

---

<div class="post-metadata">

**Author:** ![rubina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e47c2d/32.png) [@rubina](https://www.ruby-forum.com/u/rubina)\
**Post date:** [April 7, 2009, 3:41pm UTC](https://www.ruby-forum.com/t/array-question-how-dynamic-is-dynamic/164927/3 "2009-04-07T15:41:02Z")

</div>

On Apr 7, 8:50 am, Ruby S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> sAr0 (sub array row 0 to row n, where n is 3 for this case)  
> sAr0 = [A, B, C, D]  
> sAr1 = [B, A, C, D]  
> sAr2 = [D, C, B, A]  
> sAr3 = [C, A, D, B]

I suggest you use the Matrix class (in the standard library).

Though for the row case, you don’t need anything special:  
sAr0 = mA[0] = [A, B, C, D]  
sAr1 = mA[1] = [B, A, C, D]  
sAr2 = mA[2] = [D, C, B, A]  
sAr3 = mA[3] = [C, A, D, B]  
If you change sAr0, it will be reflected in mA[0].

– Mark.

---

<div class="post-metadata">

**Author:** ![rubina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e47c2d/32.png) [@rubina](https://www.ruby-forum.com/u/rubina)\
**Post date:** [April 7, 2009, 6:00pm UTC](https://www.ruby-forum.com/t/array-question-how-dynamic-is-dynamic/164927/4 "2009-04-07T18:00:43Z")

</div>

On 07.04.2009 15:38, Mark T. wrote:

> > Sub Arrays:  
> > sAr0 (sub array row 0 to row n, where n is 3 for this case)  
> > sAr0 = [A, B, C, D]  
> > sAr1 = [B, A, C, D]  
> > sAr2 = [D, C, B, A]  
> > sAr3 = [C, A, D, B]
> 
> I suggest you use the Matrix class (in the standard library).

Are you sure this works? It seems, when I create a row Vector of the  
Matrix it is read only. At least []= is defined private.

But I agree to the general advice to use a special class for this and  
not try to work with nested Arrays. That’s what OO is for. Defining a  
two dimensional matrix with Vector proxies isn’t too hard.

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![rubina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e47c2d/32.png) [@rubina](https://www.ruby-forum.com/u/rubina)\
**Post date:** [April 9, 2009, 3:00pm UTC](https://www.ruby-forum.com/t/array-question-how-dynamic-is-dynamic/164927/5 "2009-04-09T15:00:40Z")

</div>

On Tue, Apr 7, 2009 at 11:59 AM, Robert K.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)wrote:

> > > [C, A, D, B]  
> > > I suggest you use the Matrix class (in the standard library).
> 
> ```
> robert
> 
> ```

Thank you all for your input and suggestions!
