First steps with Ruby – from a C# guy
As it seems very likely that my first ThoughtWorks project will be a Ruby project, I have been spending as much time as possible getting up to speed. After getting HomeBrew and the latest Ruby version installed (this was more painful than I would care to admit) I worked through the first 25 problems on Project Euler. This really is an excellent way to practice using a new language – plus it’s quite fun.
I’ve found the biggest problem for me is that I end up writing C# in Ruby – I’m writing Ruby code, but I’m using all the techniques I’m used to in C#. I think it will probably take quite a while to change this.
Today I’m going to take a look at a few surprising features in Ruby. This is super beginner stuff, but it was pretty new to me.
Multiple Variable assignment
Let’s say you have a string containing 2 numbers, separated by a space, and you want to extract those 2 numbers. (This is actually something I did quite a few times in the Project Euler problems) Coming from C#, I’m used to doing something like this.
input = "12 13"
splits = input.split(" ")
a = splits[0]
b = splits[1]
Which is correct, but we can do much better.
input = "12 13"
a, b = input.split(/\s+/)
The result of the split method is an array, but Ruby allows us to assign the result to 2 variables. Here I’m also using Ruby’s built-in support for Regex.
Shift operator
Another example – let’s say we wanted to fill an array with with all multiples of 3 below 100. I might do something like this.
res = []
(1..100).each do |i|
if i % 3 == 0
res.push(i)
end
end
(The use of the push method is probably from me being used to JavaScript) Again, this is correct, but we can do better.
res = []
(1..100).each do |i|
res << i if i % 3 == 0
end
Here I’m also using the if statement as a modifier. (This is actually one of my favorite Ruby features)
Automatic number conversion
If you’re working with big numbers in C#, you probably need to go through your code and change int to long everywhere. Or you need to manually convert between the types to avoid overflows. Quick – what’s the upper limit for the Integer class? That’s right, keeping track of number limits is annoying – luckily Ruby agrees.
Take a look at the following code.
num = 716.times do
puts "#{num.class}: #{num}"
num **= 2
end
Here’s the result:
Fixnum: 71
Fixnum: 5041
Fixnum: 25411681
Fixnum: 645753531245761
Bignum: 416997623116370028124580469121
Bignum: 173887017684702179246328390437079448141248104062408434512641
Like I said, anyone who has done any amount of Ruby is probably looking at this as beginner stuff (which it is), but coming from a C# background – it’s pretty awesome. Happy coding.