ruby - 如何在 Ruby 中实现私有(private)内部类

标签 ruby class private-class

来自 Java,我正在尝试在 Ruby 中实现 LinkedList。我在 Java 中实现它的通常方法是有一个名为 LinkedList 的类和一个名为 Node 的私有(private)内部类,其中 LinkedList 的每个对象都作为 Node 对象。

class LinkedList
  private
  class Node
    attr_accessor :val, :next
  end
end

我不想将 Node 类暴露给外部世界。然而,通过 Ruby 中的这个设置,我可以使用这个访问 LinkedList 类之外的私有(private) Node 类对象 -

node = LinkedList::Node.new

我知道,在 Ruby 1.9 中,我们可以使用 private_constant 方法将 Node 指定为私有(private)常量。但我想知道这是否是实现此目标的正确方法?另外,为什么我能够在 LinkedList 类之外创建 Node 对象,即使它被声明为私有(private)的?

最佳答案

why am I able to create Node objects outside the LinkedList class even though it is declared as private?

因为在 ruby​​ 常量中忽略“常规”可见性修饰符。它们始终是公开的,无论它们位于哪个部分。要将它们设为私有(private),请使用 private_constant。称之为不优雅的设计或其他什么,但事实就是如此。

另外,请注意,即使使用 private_constant,隐私也意义不大。基本上,它唯一做的就是从列表中隐藏常量 (LinkedList.constants) 和直接解析 (LinkedList::Node)。如果知道该名称,他们能够访问它。

class LinkedList
  class Node
    attr_accessor :val, :next
  end

  private_constant :Node
end

LinkedList.const_get('Node') # => LinkedList::Node

关于ruby - 如何在 Ruby 中实现私有(private)内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39716799/

相关文章:

ruby - gem 安装 - fatal error : 'ruby/config.h' file not found in Mojave

ruby-on-rails - Rails Unicorn - 启动请求和到达 Controller 之间的延迟

javascript - Jquery 在没有类时隐藏类

class - 找不到类异常:找不到MyMapper.class

java - 在 JUnit 中引用私有(private)类

ruby - 使用系统中的 rbenv 和 "shell"命令更改 Ruby 版本不起作用

ruby-on-rails - ruby rails : How to check if the Model Exists

Java 从泛型 Class 对象获取方法

java - 如何从 nashorn 访问 Java 对象函数

c# - 私有(private)类是否需要通过属性访问?