红宝石-一个超类,两个子类和一个通用方法-出现错误

时间:2019-02-08 16:22:51

标签: ruby-on-rails ruby subclass mixins superclass

以下内容具有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

1 个答案:

答案 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”,那么就没有问题。但是否则,我只会看到它妨碍理解。

让所有各方都完全理解,术语“ <类>类方法” 在上面用的是口语含义。