Ruby 类中的类(或模块中的模块)

标签 ruby

当我阅读不同的 Ruby 书籍时,我注意到 Ruby 类可以在其他 Ruby 类或模块中定义。这是类中类的示例:

class Outerclass
  def foobar
    puts "FOOBAR"
  end

  class Innerclass   
    def barfoo
      puts "BARFOO"
    end
  end
end

这是我在 IRB 中运行的一些代码,试图从概念上理解这一点:

oc = Outerclass.new # => #<Outerclass:0x00000100a46478>

Outerclass.instance_methods(false) # => [:foobar]

ic = Outerclass::Innerclass.new # => #<Outerclass::Innerclass:0x00000100a0b120>

ic = Outerclass::Innerclass.instance_methods(false) # => [:barfoo]

这是我的问题:

  1. 当 ruby​​ 解释器第一次遇到我上面的类定义代码时,它会通过我编写的方法并将它存储在某个地方吗?我知道实例方法“foobar”实际上并没有运行,因为在 Outerclass 定义中没有调用它。

  2. 顺应第一个问题,当 Ruby 遇到类 Innerclass 时怎么办?这里发生了什么?

  3. 一般来说,您希望在类中包含类的原因有哪些?这样做有什么好处吗?

  4. Outerclass 的实例是否知道关于类 Innerclass 的任何信息?

  5. Innerclass 的实例是否知道 Outerclass 类的任何信息?

感谢您提供的任何帮助!

最佳答案

当解释器遍历这个文件时,它会像这样分配类:

OuterClass = Class.new do 
  def foobar
    puts "FOOBAR"
  end

  InnerClass = Class.new do   
    def barfoo
      puts "BARFOO"
    end
  end
end

因此,当 Ruby 遇到嵌套类时,它会将其分配给常量 InnerClass,而常量 InnerClass 会分配给常量 OuterClass,它们之间没有任何关系。

InnerClass 没有对 OuterClass 的继承:

  InnerClass.ancestors
  => [InnerClass, Object, Kernel, BasicObject]

当您调用 OuterClass::InnerClass 常量时,您指的是在 OuterClass 常量下命名的 InnerClass 常量,它等于类.new 语句分配给它。

一本关于此的好书是“Metaprogramming Ruby”。它详细介绍了类、单例、模块等。

关于Ruby 类中的类(或模块中的模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739640/

相关文章:

Ruby Hash 初始化(默认值 nil)

javascript - Ruby on Rails 实现 Ajax 帖子和评论

java - 搞乱 PATH 后找不到 Rake 命令 - 另外,rails 命令也不起作用

ruby - 是否可以将 `retry` 关键字与 `if` 内联使用?

javascript - Rails 4 - javascript 文件未在生产中加载但在本地运行良好。 (英雄)

ruby gem 语句 - 它有什么作用?

javascript - Ruby on Rails Javascript 在开发/生产方面有所不同

ruby c 扩展如何管理 2 个对象之间的垃圾回收

ruby - 使用 DO End 循环时出现随机枚举器错误

ruby - 从Ruby中的数组中删除前导零元素