这是违反ruby中封装的简单方法吗?

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

输出应该是这样的:

Hi
NoMethodError: private method `private_bar'

然而,输出是:

Hi
Oi, you don't work 

为什么会这样?这一定是个BUG,不然就是严重违反了信息封装对吧?

您对一种可以让您编写的语言有何期望

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

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

puts 1+2
#=> -1

?

更严肃地说,Ruby 中几乎没有什么是禁止的:它使实验和学习 Ruby 内部工作变得更容易。在某些情况下,它可以编写更简洁的代码或获得 "magical" 使用更严格的语言更难或不可能重现的行为。

在您的示例中,可以调用私有方法,但您不能使用通常的语法。

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

使用 Object#send 允许您调用方法,尽管它们是可见的。就这么简单。