A flexible Ruby Observable module
A few notes on making this look more like idiomatic Ruby:


There's no need to use return unless @observers in every method. You initialize @observers to a known value, which will never be falsy; there is no harm at all in assuming it will still be set later.
Any time you initialize an empty array, iterate a collection and (for each item) append something to the array, you're missing out on a map.

Instead of this...

variables = []
entry[1].each do |symbol|
  variables &lt;&lt; instance_variable_get("@#{symbol}")
end
observer.send(entry[0],*variables)


...use this:

variables = entry[1].map { |symbol| instance_variable_get("@#{symbol}") }
observer.send(entry[0],*variables)

The last statement in a method is the return value; get rid of your explicit returns:

def count_observers
  @observers.size
end