Могу ли я добавить определение класса изнутри модуля? - PullRequest
1 голос
/ 02 ноября 2010

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

module Hah
  class String
    def hurp
      "hurp durp"
    end
  end
end
#make sure the file containing the module is loaded correctly.
puts "Yup, we loaded"

#separate file
include Hah
"foobar".hurp
#should be "hurp durp"

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

undefined method `hurp' for "foobar":String

Так как я могу это сделать?

1 Ответ

3 голосов
/ 02 ноября 2010
module Hah
  class String
    #...
  end
end

примерно эквивалентно:

class Hah::String
  #...
end

, который делает класс Hah::String и не ссылается на класс String в глобальном пространстве имен. Обратите внимание, что последний работает, только если module Hah уже был объявлен (с ключевым словом module, Module.new и т. Д.), Тогда как первый объявляет или повторно открывает module Hah, а затем в этой области объявляет или повторно открывает class String, что в контексте неявно class Hah::String.

Чтобы открыть класс String в глобальном пространстве имен, используйте:

module Hah
  class ::String
    #...
  end
end

потому что ::String ссылается на класс String строго в верхнем уровне / глобальном пространстве имен.

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