Was*_*doo 5 ruby class private-class
来自Java,我试图在Ruby中实现LinkedList.我在Java中实现它的常用方法是使用一个名为LinkedList的类和一个名为Node的私有内部类,其中LinkedList的每个对象都是Node对象.
class LinkedList
private
class Node
attr_accessor :val, :next
end
end
Run Code Online (Sandbox Code Playgroud)
我不想将Node类暴露给外部世界.但是在Ruby中使用此设置,我可以使用以下方法访问LinkedList类之外的私有Node类对象 -
node = LinkedList::Node.new
Run Code Online (Sandbox Code Playgroud)
我知道,使用Ruby 1.9,我们可以使用private_constant方法将Node指定为私有常量.但我想知道这是否是实现这一目标的正确方法?另外,为什么我能够在LinkedList类之外创建Node对象,即使它被声明为私有?
为什么我能够在LinkedList类之外创建Node对象,即使它被声明为私有?
因为在ruby常量中忽略"常规"可见性修饰符.他们总是公开的,无论他们在哪个部门.要使他们私密,请使用private_constant.称之为不优雅的设计或其他什么,但事实就是如此.
此外,请注意,即使有private_constant,私人意味着很少.基本上,它唯一能做的就是从lists(LinkedList.constants)和direct resolution(LinkedList::Node)中隐藏常量.如果知道名称,他们将能够访问它.
class LinkedList
class Node
attr_accessor :val, :next
end
private_constant :Node
end
LinkedList.const_get('Node') # => LinkedList::Node
Run Code Online (Sandbox Code Playgroud)