Ruby受保护的常数,或类似的实现

问题描述 投票:0回答:1

我想实现以下内容:

module A
  class B
  end
  # can call A:B within module
end

# cannot call A:B outside of module (like private constant)

我基本上想要私有常量,但是我希望能够在模块内使用命名空间来调用它们。

在我看来,我需要在A内的B常量上采取某种受保护的行为,但是据我所知,Ruby没有受保护的常量。

我很想听听有关如何实现这一点的想法。

ruby-on-rails ruby oop private
1个回答
0
投票

可以做到,但我不知道你为什么要这么做。

module A
  class B
    def greeting
      puts "hi within #{self}"
    end
  end
  puts "constants within A = #{constants}"
  B.new.greeting
  # <more code>
  # lastly...
  const_set("B", nil)
end

显示:

constants within A = [:B]
hi within #<A::B:0x00005b2a18ffc538>
warning: already initialized constant A::B
warning: previous definition of B was here

然后,

A::B.new.greeting
  NoMethodError (undefined method `new' for nil:NilClass)

如果需要,可以在命令行中添加'-W'-W0以禁止显示警告消息。

© www.soinside.com 2019 - 2024. All rights reserved.