More Ruby Woes

16 7

Wed Dec 26 14:36:39 +0000 2007

I have been giving Ruby the old college try. I was running into some strange difficulties with a minimax function in Ruby that at first I thought were more scoping oddities.

It turns out that the clone and dup operators on Arrays in Ruby only perform shallow copying, which will pretty much not work on multidimensional arrays. Oh well, I guess I would have to write my own, or copy someone else's, right? Maybe something like:
def deepcopy(x)
  if x.kind_of? Array
    copy = []
    x.each { |y|  copy += [deepcopy(y)] }
    return copy
  else
    return x.dup
  end
end


Wrong. Ruby's almost-but-not-quite pure-OO nature actually makes it nearly impossible to create a generic deep copy function. The problem is that integers, floats, and so forth are not the complete objects we thought they were, because you can't dup them:
>> x = 1.dup
TypeError: can't dup Fixnum
	from (irb):1:in `dup'
	from (irb):1


So much for pure OO.

The best solution I could come up with for a two-deep copy is (knowing ahead of time that it is a matrix):
def copy2(b)
	newb = []
	b.each { |r|  newb += [r.dup] }
	return newb
end


This, along with the odd scoping rules and counter-intuitive syntax are making me seriously consider ending my Ruby experiment. And I so wanted to love Ruby.
blog comments powered by Disqus