[Wtr-general] OT: The original problem. Re: A small doubt in Ruby
Charley Baker
charley.baker at gmail.com
Mon Mar 5 14:42:40 EST 2007
Strange, I tried the example from Jonathan Kohl, and it worked fine.
The idea in Ruby is that variables hold references to objects not the
objects themselves similar to Java. If you've worked in c/c++ this will make
more sense, Ruby, Java and some other languages hide the ugliness of this
under the covers. So when you create a variable and assign it to something,
it's holding a pointer to the actual object. When you then assign that to
another variable, you've now got two variables pointed to the same object in
memory.
a = 'foo' # create a variable named a that points to an object somewhere
in memory
b = a # now create b which will point to that same object in memory,
in this case a string object
puts a.object_id
=> object_id whatever
puts b.object_id
=> the same object_id since they both point to the same object in memory
Enumerating through a collection of some sort like an Array, makes it a bit
more confusing. If you end up returning strings, for example, then those are
new objects which won't then hold reference to the original objects in your
collection. Hopefully that makes some sense. :)
-Charley
On 3/5/07, Chris McMahon <christopher.mcmahon at gmail.com> wrote:
>
> On 3/5/07, vijay <forum-watir-users at openqa.org> wrote:
> > Thank you Zeljko Filipin. That was an useful and an interesting '.pdf'.
> >
> > Thanks,
> > Vijay.
>
> For those interested in both history and the vagaries of OO
> programming, the original issue was a problem I stumbled across and
> mentioned on the list for people reviewing Brian's book. It's an
> interesting issue, and a good thing to be aware of, if you aren't
> already. For me, it comes up when I work with databases, since what
> comes back from Ruby ODBC is almost always an AoA, and that's where I
> got into trouble...
>
> #########################################
> require 'test/unit'
> class TOY_CASE<Test::Unit::TestCase
>
> def test_toy_test
>
> aoa = [[1,2,3],[4,5,6]]
>
> aoa.each do |arr|
> arr.each do |item|
> item = item.to_s
> end
> assert_equal(["1","2","3"],arr)
> end
>
> end #def
> end #class
> #####################################
> 1) Failure:
> test_toy_test(TOY_CASE)
> [bar.rb:12:in `test_toy_test'
> bar.rb:8:in `each'
> bar.rb:8:in `test_toy_test']:
> <["1", "2", "3"]> expected but was
> <[1, 2, 3]>.
>
> 1 tests, 1 assertions, 1 failures, 0 errors
> >Exit code: 1
>
> I had to go to the comp.lang.ruby list for an answer. Even my local
> Ruby guru didn't see the problem immediately.
>
> Apparently inside an "each" loop you're only working on a copy of the
> item, not the item itself, so to_s isn't actually working on the real
> items in the array.
>
> To make this work, you have to use "map":
>
> aoa.each do |arr|
> arr.map! do |item|
> item = item.to_s
> end
>
>
> Jonathan Kohl mentions an opposite but similar weirdness:
>
> a = %w[a b c]
> b = a
> b = %w[x y z]
> p a
> =>
> x y z
> p b
> =>
> x y z
> when what was expected was this:
> p a
> =>
> ["a", "b", "c"]
> _______________________________________________
> Wtr-general mailing list
> Wtr-general at rubyforge.org
> http://rubyforge.org/mailman/listinfo/wtr-general
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://rubyforge.org/pipermail/wtr-general/attachments/20070305/901821ef/attachment.html
More information about the Wtr-general
mailing list