Bechma Bechma - 21 days ago 8
Ruby Question

Is this a simple way to violate the encapsulation in ruby?

class Foo
@@first_time = true

def self.private_bar
if @@first_time
puts "Hi"
else
puts "Oi, you don't work here"
end
@@first_time = false
end

private_class_method :private_bar

public
def calling_private_method
self.class.send :private_bar
another_private_bar
end
end

f=Foo.new
f.calling_private_method
f.class.send :private_bar


The output should be something like this:

Hi
NoMethodError: private method `private_bar'


However, the output is:

Hi
Oi, you don't work


Why is this happening? This must be a bug otherwise it is an important violation of the encapsulation of information, right?

Answer

What do you expect from a language that lets you write

String = Array
puts String.new.inspect
#=> []

or

class Fixnum
  def +(b)
    self-b
  end
end

puts 1+2
#=> -1

?

On a more serious note, almost nothing is forbidden in Ruby : it makes it easier to experiment and to learn Ruby inner workings. In some cases, it makes it possible to write more concise code or get "magical" behaviors that would be harder or impossible to reproduce with a stricter language.

In your example, it's possible to call a private method, but you cannot use the usual syntax.

Comments