如何在Ruby中实现私有内部类

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对象,即使它被声明为私有?

Ser*_*sev 9

为什么我能够在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)

  • @WastedPandoo:是的,红宝石的方式是不打扰私人的事情.只需将其标记为"内部",如果直接使用,"保修无效". (2认同)
  • 甚至更多:`LinkedList.public_constant(:Node); LinkedList :: Node.new` :) (2认同)