Thoughts on Software and Technology

If it quacks like a duck & walks like a duck…

…it may actually be a penquin in disguise!

Ahh, the throws of young love. Remember that first wild romance? The incredible highs, the tragic lows, the fact that the swung from one to the other in 30 second intervals?

I had an interesting afternoon yesterday fighting with my new lover, Ruby.

I’m building a data processing application and started playing around with FasterCSV. It’s a great library, with the possible exception that it may secretly be giving me evil penguin pseudo-duck classes.

From various examples:

FasterCSV.foreach('/path/to/file') do |row|
  foo = row[0]
  bar = row[1]
  puts foo + bar
end

Pretty nice. FasterCSV returns an array of values. It’s a fast way to access CSV files, especially using it’s :header, :col_sep and other arguments which would allow nice programmatic handing of CSV files easily.

But I had a problem. I’m used to fast one-liners and don’t like to spend all day setting variables when I really want to be calculating dissolved oxygen percentage. Thus I went straight to:

FasterCSV.foreach('/cool/scientific/data') do |row|
  temp, cond, ph, domgl, depth, sal, turb = row[2..8]
  …
  blah = temp * 375
  …
end

Evil penquin pseudo-duck classes!

Crash!

Well, not really crash. We love that word, though, don’t we. “My Excel crashed!” I’ll restate for clarity:

Exception!

Apparently, multiplying nil by an integer is an exception.

“What? Do I have blank line? How is temp nil?”

Well, you real Rubologists may know, but I didn’t. I thought that I could shortcut those variables, but it didn’t work! It took a long time, and I read more about Ruby slicing than I wanted to.

Turns out that you can, of course, shortcut those variables… provided that method exists. I guess it doesn’t in the duck-typed class returned by FasterCSV. Hunting around, I found that our friend row had a ‘to_a’ method. Thus, this works.

<pre>FasterCSV.foreach('/cool/scientific/data') do |row|
  temp, cond, ph, domgl, depth, sal, turb = row.to_a![2..8]
  …
  blah = temp * 375</pre>
  …
end

So, the lesson here: Just because examples tell you it’s an array, and because you can pull a value like an array, don’t assume that it is an array.

Apparently, this thing didn’t act quite enough like a duck.


No Comment

I've turned off comments on this blog. You can read all about that decision on Google+. I'm available at Google+ and Twitter for continued communication.

Comments are closed.

Powered by WordPress | Designed by Elegant Themes