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

时间:2013-02-06 21:59:28

标签: 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的任何内容?

  6. 感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:52)

当解释器通过这个文件时,它会分配这样的类:

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

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

所以当Ruby遇到嵌套类时,它会将它分配给常量InnerClass,它被赋值给常量OuterClass它们彼此之间没有任何关系。

InnerClass没有继承OuterClass

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

当您调用OuterClass::InnerClass常量时,您正在引用InnerClass常量下的OuterClass常量,该常量等于分配给它的Class.new语句。

阅读这篇文章的好书是“Metaprogramming Ruby”。它涉及课程,单身人士,模块等的细节。

答案 1 :(得分:0)

Jörg W Mittag 在评论 Michael Papile 的回答时说得最好:

没有内部类和外部类。只有两个完全不相关的类。一个恰好被分配到另一个内部的常量命名空间。