在以下测试案例中:
class Package
class Component
def initialize
p [:initialize,self]
end
end
end
class Package_A < Package
end
class Package_B < Package
end
# Why are the following components of type Package and not Package_A and Package_B
component=Package_A::Component.new
p component
component=Package_B::Component.new
p component
结果:
[:initialize, #<Package::Component_1:0x2c0a8f8>]
#<Package::Component:0x2c0a8f8>
[:initialize, #<Package::Component_1:0x2c0a5b0>]
#<Package::Component:0x2c0a
如何获取特定的Package_A.component和Package_B.component?
答案 0 :(得分:6)
类Component
在Package
中声明,所以看起来是正确的。 ::
告诉您在Component
范围内查找名称Package_A
。由于那里没有Component
,它会查找超类。
此示例显示如何实现您想要的效果。可能有一种更简单的方法,我很乐意看到它。
class Package
class Component
def foo
puts "bar"
end
end
end
class Pack_a < Package
end
Pack_a::Component.new.foo
#=> bar
# as expected, though we actually have Package::Component
class Pack_b < Package
class Component
end
end
Pack_b::Component.new.foo
#=> NoMethodError: undefined method 'foo' for Pack_b::Component
# this error is because Pack_b::Component has nothing to do with Package::Component
class Pack_c < Package
class Component < Package::Component
end
end
Pack_c::Component.new.foo
#=> bar
# as expected
Pack_c::Component.new
#=> Pack_c::Component
# this Component is a subclass of Package::Component
这更应该解释范围如何在这种情况下起作用。希望这会有所帮助。