在Ruby中执行外部类的构造函数后创建内部类对象?

时间:2019-07-03 15:20:13

标签: ruby class constructor inner-classes

我想为一个类中的内部类创建对象。所有内部类方法都使用一个公共变量,在创建外部类时需要对其进行初始化。

class A
    @x = nil
    @y = nil
    def initialize(x, y)
        @x = x
        @y = y
    end

    class B
        def func_b
            puts "x- #{@x} and y- #{@y} in class B"
        end
    end

    class C
        def func_c
            puts "x- #{@x} and y- #{@y} in class C"
        end
    end
end

我能够为类BC创建对象,如

#1
b = A::B.new
#2
a = A
c = a::C.new

但是我想在为AB创建对象之前初始化C

类似

a = A.new(4,5)
b = a::C.new

但这似乎不起作用。我该怎么做。

2 个答案:

答案 0 :(得分:2)

Ruby中的嵌套模块和类主要是组织选择。比较

class A; end
class B; end

还有这个

class A
  class B; end
end

两者之间只有两个区别

  1. 在第二个示例中,您必须编写A::B才能访问B
  2. 在第二个示例中,将在B中查找在A中访问的常量,然后在顶级中查找它们。

如果您实际上希望这些类的 instances 相关联,则需要它们之间的子类和超类关系,即

class B < A; end

现在B的实例可以访问A中的方法和实例变量。请注意,这与嵌套无关,您可以将其定义为

class A
  class B < A; end
end

但同样,这只是组织上的差异。


在完全独立的音符上,这

class A
  @x = nil
  @y = nil
end

按照您认为的做。这是在A本身上设置实例变量,即将A视为A.singleton_class的实例。如果要使用A instances 的默认值,则必须在initialize中设置这些值:

class A
  def initialize
    @x = nil
    @y = nil
  end
end

答案 1 :(得分:0)

class A
    def initialize(x, y)
        @x = x
        @y = y
    end
end

class B < A
    def func_b
        puts "x- #{@x} and y- #{@y} in class B"
    end
end

class C < A
    def func_c
        puts "x- #{@x} and y- #{@y} in class C"
    end
end

c = C.new(4,5)
c.func_c

打印

x- 4 and y- 5 in class C

这似乎很好:)。