Ruby: открытие класса из модуля - PullRequest
1 голос
/ 23 декабря 2010

Почему это не работает?

module XT
  puts Fixnum.class  # So we're sure to re-open the Fixnum class
  class Fixnum
    def hi
      puts "HI from module XT"
    end
  end
end

После запроса и загрузки модуля метод hi по-прежнему не добавляется в Fixnum.Это работает, если я удаляю модуль оболочки.

Ответы [ 2 ]

6 голосов
/ 23 декабря 2010

Как писал @Jeremy, константы имеют пространство имен с помощью модулей, и определение класса - это просто присвоение объекта класса константе.По существу,

class Fixnum; end

(приблизительно) эквивалентно

Fixnum = Class.new

(за исключением того факта, что если Fixnum уже существует, первый откроет его, а второй перезапишетэто).

Это означает, что если вы сделаете это внутри модуля (или класса, поскольку модуль класса IS-A), то константа Fixnum будет находиться в пространстве имен внутри этого модуля.

Если вы хотите явно получить доступ к константе верхнего уровня, вы можете указать Ruby запустить его поиск на верхнем уровне очень похоже на то, как вы говорите Unix запустить поиск файловой системы на верхнем уровне:

module XT
  class ::Fixnum; end
end
4 голосов
/ 23 декабря 2010

Вы определяете XT::Fixnum, а не Fixnum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...