Использование модулей в качестве пространств имен для переопределения встроенных классов в Ruby - PullRequest
1 голос
/ 26 сентября 2010

У меня есть класс Date, который я хотел бы использовать для перезаписи класса Date Руби. Однако всякий раз, когда я делаю require 'Date' в других моих файлах, он включает класс Date Руби, а не мой собственный.

Я думал, что поместить его в модуль будет хорошо, поэтому я сделал это в файле Date.rb:

module myModule
  class Date
  #...
  end
end

Однако я до сих пор не могу понять, как заставить другие мои классы включать этот Date класс, а не встроенный класс. Как мне этого добиться?

Вся помощь приветствуется и спасибо заранее!

Ответы [ 3 ]

1 голос
/ 26 сентября 2010
require 'path/to/Date.rb'

class MyClass
    include MyModule::Date
end
1 голос
/ 30 сентября 2010

Адам

Лучше всего просто следовать некоторым правилам:

  1. Всегда называйте имена файлов строчными (date.rb, а не Date.rb)
  2. Поместите ваши файлы в определенную директорию внутри вашей библиотеки (lib - хороший кандидат)
  3. Не называйте ваши файлы так же, как встроенные в классы Ruby (назовите его my_date.rb или что-то в этом роде), или если ваш класс / модуль находится в пространстве имен внутри модуля, поместите его в папку с именем модуля ( lib/my_module/date.rb).

Это устраняет любую неопределенность в том, какой файл вы пытаетесь загрузить. Если вам абсолютно необходимо сохранить его с именем date.rb, загрузите его с полным путем, выполнив что-то вроде: File.join(File.dirname(__FILE__), "date.rb").

В целях отладки вы можете посмотреть на следующие специальные переменные, чтобы увидеть, что загружается вместо вашего файла:

  • $: покажет путь загрузки (т. Е. Каждый каталог, в котором он ищет нужные файлы. Вы заметите, что текущий каталог (.) является последним. Вот почему ваш файл не загружен - сначала он просматривает системный путь. Вы всегда можете переместить текущий каталог в начало пути загрузки в качестве решения, выполнив $:.unshift(File.dirname(__FILE__)), но я бы попробовал один из приведенных выше подходов, прежде чем прибегнуть к этому
  • $" показывает каждый файл, который был необходим в вашей текущей среде.
0 голосов
/ 26 сентября 2010

Во-первых, вам нужно указать правильный файл.Часто правильная вещь происходит, когда вы делаете require 'date', и это разрешается в файл на основе вашего $ LOAD_PATH.Вы можете быть более конкретным, поместив ваш date.rb в каталог, чтобы вы могли require 'my_module/date' или просто использовать относительный путь, такой как ./date

. Затем вы можете указать иерархию модулей при обращении к этому классу:1006 *

::MyModule::Date

Или вы можете включить его там, где вы предпочитаете называть это Date, вместо стандартного без указания:

class Event
  include MyModule
  def initialize
    @date = Date.today # refers to MyModule::Date
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...