我想为一个类中的内部类创建对象。所有内部类方法都使用一个公共变量,在创建外部类时需要对其进行初始化。
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
我能够为类B
和C
创建对象,如
#1
b = A::B.new
#2
a = A
c = a::C.new
但是我想在为A
或B
创建对象之前初始化C
类似
a = A.new(4,5)
b = a::C.new
但这似乎不起作用。我该怎么做。
答案 0 :(得分:2)
Ruby中的嵌套模块和类主要是组织选择。比较
class A; end
class B; end
还有这个
class A
class B; end
end
两者之间只有两个区别
A::B
才能访问B
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
这似乎很好:)。