Понимание Module.nesting в Ruby и типов вложений модулей

Что я знаю о модулях: модули не могут быть созданы, не создают объекты и не поддерживают наследование. Сейчас я читаю Руководства по рельсам, чтобы полностью понять функцию автозагрузки Rails. И он вводит тему о константах Ruby, особенно о модулях и классах.

Определения классов и модулей могут быть вложенными для создания пространств имен:

module XML
  class SAXParser
    Module.nesting.inspect
  end
end

 => "[XML::SAXParser, XML]"

Rails Guides заявляет, что вложение в любом заданном месте (например, Module.nesting, показанное выше) представляет собой набор внешних вложенных объектов класса и модуля. Я думаю, это означает, что он расширяется по мере продвижения наружу, поэтому внутренним будет C :: B :: A, затем следующим уровнем будет B :: A, а следующим уровнем будет A, при условии, что:

module A 
  module B
    class C
    end
  end
end

Затем приводится другой случай:

class XML::SAXParser
  Module.nesting.inspect
end
 => "[XML::SAXParser]"

Как видите, раскладка другая. В Rails Guide сказано: «XML ему не принадлежит». Что означает это заявление? К нему не относится? В модулях нет наследования. Может кто-нибудь лучше объяснить разницу между этими двумя случаями?

Вы можете посмотреть эта статья, хотя @Max дает хорошее объяснение.

Cary Swoveland 18.12.2018 23:06
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
1
447
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Ruby вложенность - это конструкция синтаксический. Другими словами, это связано с тем, как код фактически записывается в сценарии. Разница во вложенности очевидна, если вы проигнорируете семантика, удалив имена, и просто посмотрите на синтаксис:

module ...
  class ...
    ...
  end
end

# as opposed to

class ...
  ...
end

Один - это класс внутри модуля, другой - просто класс. Семантически оба могут относиться к одному и тому же объектXML::SAXParser, но для вложенности это не важно.

Это имеет значение в Ruby, потому что постоянный поиск выполняется с использованием вложенности, в отличие от поиска метода, который использует отношения семантических объектов.

A = "top level"
module XML
  A = "module level"
  class SAXParser
    puts A # module level

    def self.a
      "defined in a class in a module"
    end
  end
end

class XML::SAXParser
  puts A # top level
  puts a # defined in a class in a module
end

Можете ли вы определить, что вы подразумеваете под «отношениями семантических объектов»?

Daniel Viglione 20.12.2018 00:25

Я имею в виду такие вещи, как наследование, включенные модули, одиночные классы. Все способы, которыми объекты связаны друг с другом по значению, а не только то, как они организованы в вашем исходном коде.

Max 20.12.2018 14:35

Другие вопросы по теме