Suppress warnings from Ruby

We Ruby programmers routinely do things that other programmers frown upon, and – in many cases – won’t even be allowed to do by their interpreter/compiler.

Case in point for this article, is redefining constants. In Ruby a constant isn’t constant. Creating a constant is merely a way for the programmer to indicate a value that really isn’t supposed to be changed – but if you do anyways, you’re on your own.

To that effect, Ruby by default outputs a warning if you try to redefine a constant:

warning: already initialized constant FLAGS

Occasionally you are perfectly aware of what you’re doing and redefining a constant in ie third party code might be the best way to achieve the results you need. When that’s the case, looking at that warning gets tiresome pretty quickly.

You could run your ruby scripts with -W0 to not see any warnings at all, but that’s a bit too ostrich-like a behavior. What you want is to on a case by case basis silence specific warnings.

To do this, use the following code:

module Kernel
  def suppress_warnings
    original_verbosity = $VERBOSE
    $VERBOSE = nil
    result = yield
    $VERBOSE = original_verbosity
    return result

This allows you to do:

>> X = :foo
=> :foo
>> X = :bar
(irb):11: warning: already initialized constant X
=> :bar
>> suppress_warnings { X = :baz }
=> :baz

Remember to use this responsibly – warnings are there for a reason. Although, for extra credit, try running your Rails project with full verbosity – ie `ruby -W2 script/server` – I sure was surprised by the output.