为什么要 private 封装一个私有常量?

Why would you private encapsulate a private constant?

我运行进入这段代码:

class Foo < Bar
  SM_CONSTANT = { 'a' => 'A', 'b' => 'B' }.freeze
  private_constant :SM_CONSTANT

  private

  def some_constant
    SM_CONSTANT
  end

我无法理解私有方法中封装一个私有常量的目的。我为什么要这样做?

之所以private_constant是为了防止其他代码直接访问常量。

some_constant 可能 return 今天不变,但它没有义务这样做。如果按合同编程,则它有义务 return 该形式的散列,其来源无关紧要。

例如,你今天有那个代码,但明天它会演变成:

class Foo < Bar
  SM_CONSTANT = {
    a: { name: 'A', priority: 2 },
    b: { name: 'B', priority: -1 }
  }.freeze
  private_constant :SM_CONSTANT

private
  def some_constant
    SM_CONSTANT.map { |k,o| [ k.to_s, o[:name] ] }.to_h
  end
end

内部结构完全改变但外部代码没有任何变化,相同的调用产生相同的结果。这就是封装很重要的原因。它使您可以在特定上下文中自由地迭代和修改代码,而不必担心自己会破坏其他东西。

如果代码直接访问 SM_CONSTANT,则必须重写它才能接受这个新结构。