ruby - один суперкласс, 2 подкласса и один общий метод - ошибка - PullRequest
0 голосов
/ 08 февраля 2019

Следующие элементы имеют Universe (суперкласс), Common (модуль), FlatEarthBelievers (подкласс) и RoundEarthBelievers (подкласс).Есть ошибка с выводом и хотите, чтобы он работал, какие-либо указатели?

Речь идет о наследовании и миксинах, сценарии, где дочерние классы наследуют от общего Parent и хотят использовать общие методы, которые не являютсясвязанные с поведением родителей.Я хочу иметь возможность вызывать методы из общего модуля внутри класса 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 голосов
/ 08 февраля 2019

Есть много вещей не так с этим кодом.Оставьте в стороне проблему с переменной $, поскольку она обсуждается в комментариях к вашему 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 Purists, которому нравится указывать на то, что в Ruby не существует такого понятия, как метод класса.Тем не менее, я совершенно в порядке, используя термин метод класса в разговорной речи, , пока все стороны полностью понимают, что это разговорный термин .Другими словами, если вы знаете , что не существует такой вещи, как метод класса, и что термин «метод класса» просто сокращен от «метод экземпляра синглтон-класса объекта, который является экземпляромClass ", тогда проблем нет.Но в остальном я только видел, как это мешает пониманию.

Пусть все стороны полностью поймут, что термин метод класса используется выше в его разговорном смысле.

...