Velocity Reviews > Ruby > Array question - How dynamic is dynamic?

# Array question - How dynamic is dynamic?

Ruby Student
Guest
Posts: n/a

 04-07-2009
[Note: parts of this message were removed to make it a legal post.]

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

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]
qA1:
[[A, B
B, A]]

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

Etc.

Thank you

--
Ruby Student

Jesús Gabriel y Galán
Guest
Posts: n/a

 04-07-2009
On Tue, Apr 7, 2009 at 2:50 PM, Ruby Student <(E-Mail Removed)> wrote:
> 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
>
> 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)]]
=> [[#<struct O value="A">, #<struct O value="B">, #<struct O
value="C">], [#<struct O value="B">, #<struct O value="A">, #<struct O
value="C">], [#<struct O value="C">, #<struct O value="B">, #<struct O
value="A">]]
irb(main):017:0> first_row = myAr[0]
=> [#<struct O value="A">, #<struct O value="B">, #<struct O value="C">]
irb(main):018:0> Y = "Y"
=> "Y"
irb(main):019:0> first_row[2].value = Y
=> "Y"
irb(main):020:0> myAr
=> [[#<struct O value="A">, #<struct O value="B">, #<struct O
value="Y">], [#<struct O value="B">, #<struct O value="A">, #<struct O
value="C">], [#<struct O value="C">, #<struct O value="B">, #<struct O
value="A">]]

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.

Mark Thomas
Guest
Posts: n/a

 04-07-2009
On Apr 7, 8:50*am, Ruby Student <(E-Mail Removed)> wrote:
> 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]

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.

Robert Klemme
Guest
Posts: n/a

 04-07-2009
On 07.04.2009 15:38, Mark Thomas wrote:
> On Apr 7, 8:50 am, Ruby Student <(E-Mail Removed)> wrote:
>> 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]

>
> 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

Ruby Student
Guest
Posts: n/a

 04-09-2009
[Note: parts of this message were removed to make it a legal post.]

On Tue, Apr 7, 2009 at 11:59 AM, Robert Klemme
<(E-Mail Removed)>wrote:

> On 07.04.2009 15:38, Mark Thomas wrote:
>
>> On Apr 7, 8:50 am, Ruby Student <(E-Mail Removed)> wrote:
>>
>>> 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]
>>>

>>
>> 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
>
>

Thank you all for your input and suggestions!

--
Ruby Student