Как создавать пространства имен?

Определения классов, помещенные в module Foo...end, - это полезный способ хранить код в своем собственном пространстве имен. Таким образом имена ваших классов не будут конфликтовать с чьими-то другими классами. Пример:

  module Foo
    class Joy
       def initialize(one, two)
           puts "one: [#{one}] two: [#{two}]"
       end
    end
  end

  module Bar
    class Joy
      def initialize(something)
         puts "Do #{something} already!"
      end
    end
  end

В это случае нельзя писать:

  Joy.new('a', 'b')

так как в текущем пространстве имен нет класса Joy. Однако,
можно писать:

  Foo::Joy.new('a', 'b')

или

  Bar::Joy.new('a crossword puzzle')

так как Joy определен в двух разных модулях, Foo и Bar.

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

Но как пользователю модулей, вам может надоесть набирать длинную форму имени класса. Одна из возможностей в данном случае - это использовать алиас:

  Joy = Foo::Joy

Тогда вы сможете использовать короткую запись:

  Joy.new('a', 'b')

Другой способ - использовать include

  include Foo

Этот код позволяет использовать Joy вместо Foo::Joy.

  include Bar

Этот код позволяет использовать Joy вместо Bar::Joy.

Однако если присутствуют оба include, Joy будет относиться к последнему включенному первый раз модулю. То есть, если написать:

  include Foo
  include Bar

то Joy - это Bar::Joy. Однако, если повторить

  include Foo

то Joy все равно относится к Bar::Joy, так как модуль Foo уже был один раз включен в текущее пространство имен.

Все это происходит в соответствии с очень строгими лексическими правилами. Если include находится внутри определения класса, только этот класс сможет использовать короткую запись. Если include находится внутри другого модуля, весь модуль сможет использовать короткую форму записи. Если include находится вне классов и модулей - на верхнем уровне в файле, везде в нем можно использовать такую запись.

Составлено Эриком Шварцем (Eric Schwartz) <emschwar@fc.hp.com>

Вход для пользователей