Modifying data in an array using a reference

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

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[i] = modify(e)
end

Alex

Ch Ba wrote:

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

Joel VanderWerf wrote:

Ch Ba wrote:

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.