Понимание Module.nesting в Ruby и типы вложений модулей - PullRequest
0 голосов
/ 18 декабря 2018

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

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

module XML
  class SAXParser
    Module.nesting.inspect
  end
end

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

Руководства по Rails указывают, что вложение в любом заданном месте(например, 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 гласит: «XML не принадлежит ему».Что означает это утверждение?Не принадлежит ли это?В модулях нет наследования.Может кто-нибудь лучше объяснить разницу между этими двумя случаями?

1 Ответ

0 голосов
/ 18 декабря 2018

В 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...