Modifying data in an array using a reference

C

Ch Ba

Ok so my situation is as follows. I have an array "foo", which contains
several instances of the class "bar". I get a copy of an object inside
of "foo" using foo.detect, and then modify that copy. Afterwards, I
need to replace the original inside the array with the modified version.
The problem is that I do not know the index of the object. How would I
go about doing that? I could use some help =)
 
A

Alex

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

Just find the index of the object. For instance, if you're iterating the
array with .each like:
arr.each do |e|
modified = modify(e)
end

You could do something like this:

arr.each_with_index do |e, i|
arr = modify(e)
end



Alex
 
J

Joel VanderWerf

Ch said:
Ok so my situation is as follows. I have an array "foo", which contains
several instances of the class "bar". I get a copy of an object inside
of "foo" using foo.detect, and then modify that copy. Afterwards, I
need to replace the original inside the array with the modified version.
The problem is that I do not know the index of the object. How would I
go about doing that? I could use some help =)

You're working with the original foo, not a copy, so you don't need to
replace the entry at a certain index:

class Bar
attr_accessor :x
def initialize x
@x = x
end
end

foo = [Bar.new(0), Bar.new(1)]
p foo

bar = foo.detect {|bar| bar.x > 0}
bar.x = "changed"
p foo

[#<Bar:0xb796c988 @x=0>, #<Bar:0xb796c974 @x=1>]
[#<Bar:0xb796c988 @x=0>, #<Bar:0xb796c974 @x="changed">]
 
C

Ch Ba

Joel said:
Ch said:
Ok so my situation is as follows. I have an array "foo", which contains
several instances of the class "bar". I get a copy of an object inside
of "foo" using foo.detect, and then modify that copy. Afterwards, I
need to replace the original inside the array with the modified version.
The problem is that I do not know the index of the object. How would I
go about doing that? I could use some help =)

You're working with the original foo, not a copy, so you don't need to
replace the entry at a certain index:

class Bar
attr_accessor :x
def initialize x
@x = x
end
end

foo = [Bar.new(0), Bar.new(1)]
p foo

bar = foo.detect {|bar| bar.x > 0}
bar.x = "changed"
p foo

[#<Bar:0xb796c988 @x=0>, #<Bar:0xb796c974 @x=1>]
[#<Bar:0xb796c988 @x=0>, #<Bar:0xb796c974 @x="changed">]


Thank you very much for the quick answers. I realized what I was doing
wrong and was in the process of fixing it when I remembered I should
remove my post. The issue was a mistake in the initialization of the
class and had nothing to do with accessing the array. I was really
confused about why it didn't seem to be modifying the original.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,172
Messages
2,570,933
Members
47,472
Latest member
blackwatermelon

Latest Threads

Top