Indentation Checking in Ruby

by Szymon LipiƄski

In Python blocks have to be indented just because the indentation level defines the logic. In C/C++/Java there are { and } while in Ruby there is begin and end. Of course indenting is helpful. Just like syntax coloring in editor.

In Ruby you can do whatever you want with the indentation. That’s not a problem. Every good editor can fix the code layout due to some rules. Normally I use VIM for all those scripting languages, for programming in Ruby and Python too. In VIM after opening any file I can do the magic command:

    <ESC>ggVG=

and the code is nicely intended. Of course that doesn’t work in Python as changing the spaces at the beginning of each line usually change the program logic.

Let’s take this simple code in Ruby (I know, indentation is quite bad):

class Example
    def test?
        puts "YEA"
  end
  end

x = Example.new
puts "Is this a test?"
x.test?

That works and running that just prints two lines on console:

    $ ruby1.8 x.rb
    Is this a test?
    YEA

Ruby1.9 works too:

    $ ruby1.9 x.rb
    Is this a test?
    YEA

For Ruby 1.9 there is magical parameter -w. Using that can be a little bit surprising:

    $ ruby1.9 -w x.rb
    ruby1.9: warning: mismatched indentations: line 4:'def' and line 6:'end'
    ruby1.9: warning: mismatched indentations: line 3:'class' and line 7:'end'
    Is this a test?
    YEA

Using that special nice command in VIM changed the code to this:

class Example
    def test?
        puts "YEA"
    end
end

x = Example.new
puts "Is this a test?"
x.test?

And now the output is without any errors:

    $ ruby1.9 -w x.rb
    Is this a test?
    YEA

For me this is quite surprising, I cannot just wait to have another switch: --treat-all-warnings-as-error so you couldn’t compile the Ruby code if there is no correct indentation.