以下内容具有Universe(超类),Common(模块),FlatEarthBelievers(子类)和RoundEarthBelievers(子类)。输出有错误,想要使其正常工作,有指针吗?
这是关于继承和混合的,子类从通用父级继承,并希望利用与父级行为无关的通用方法。我希望能够从包含/扩展它的Child类内部的通用模块中调用方法。我对它的用法感到困惑,因为我想将这些通用方法同时作为类方法和实例方法。
class Universe
$knowledge = "Universe comprises of galaxies, stars, planets, steroids, meteoroids, comets, etc"
def universe_comprises_of
puts $knowledge
end
end
module Common
$earth_is = Hash.new
def init(earth_is)
$earth_is = earth_is
end
def statement
puts " Earth is " + $earth_is["attribute"].to_str
end
end
class FlatEarthBelievers < Universe
include Common
earth_is = { :attribute => "Flat !" }
init(earth_is)
end
class RoundEarthBelievers < Universe
include Common
earth_is = { :attribute => "Round like an Orange!" }
Common.init(earth_is)
end
moron = FlatEarthBelievers.new
moron.universe_comprises_of
moron.statement
sensible_person = RoundEarthBelievers.new
sensible_person.universe_comprises_of
sensible_person.statement
答案 0 :(得分:0)
此代码有很多错误。搁置$
变量问题,因为在您的OP的注释中已对此进行了讨论。
首先,您需要做:
moron = Flat_earth_believers.new
但是您没有名为Flat_earth_believers
的任何类。您可能是说FlatEarthBelievers
。
您include
Common
模块使所有方法都在其中成为实例方法,但随后您尝试将它们称为类方法,在此处:
class FlatEarthBelievers < Universe
include Common
earth_is = { :attribute => "Flat!" }
init(earth_is) # this is calling a class method
end
和此处:
class RoundEarthBelievers < Universe
include Common
earth_is = { :attribute => "Round like an Orange!" }
Common.init(earth_is) # this is calling a class method
end
还有其他东西,但是您明白了。
无论如何,我真的不知道您要做什么,但是我想我只会像这样Universe
:
class Universe
KNOWLEDGE = "Universe comprises of galaxies, stars, planets, steroids, meteoroids, comets, etc"
def universe_comprises_of
puts KNOWLEDGE
end
end
和Common
一样:
module Common
def statement
puts "Earth is #{self.class::EARTH_IS[:attribute]}"
end
end
然后像FlatEarthBelievers
一样:
class FlatEarthBelievers < Universe
include Common
EARTH_IS = { :attribute => "Flat!" }
end
那么您可以做:
moron = FlatEarthBelievers.new
moron.universe_comprises_of
=> Universe comprises of galaxies, stars, planets, steroids, meteoroids, comets, etc
moron.statement
=> Earth is Flat!
我还要指出,Jörg W Mittag希望说:
我是那些想要指出Ruby中没有类方法之类的Ruby Purists的人之一。不过,我很好地使用了 class方法这个术语,只要各方都完全理解这是一个俗语用法。换句话说,如果您知道,就没有类方法之类的东西,并且术语“类方法”只是“作为实例的对象的单例类的实例方法”的简称的
Class
”,那么就没有问题。但是否则,我只会看到它妨碍理解。
让所有各方都完全理解,术语“ <类>类方法” 在上面用的是口语含义。