При написании кода вы определяете новый класс с именем TestModule :: String.Если вы хотите изменить встроенный класс Ruby String, вам нужно использовать полное имя String (с "" :: "), если вы хотите сохранить объявление внутри модуля.
module TestModule
class ::String
def do_something
puts self.size
end
end
def self.test(str)
str.do_something
end
end
Добавление "::" говорит Ruby, что требуемый класс String не является частью TestModule.
Возможно, будет проще объявить String вне TestModule в том же файле.
Если вы не хотите загрязнять глобальный класс String, вы можете просто изменить конкретный экземпляр String, к которому вы хотите добавить метод.
module TestModule
def self.test(str)
do_somethingify!(str)
str.do_something
end
def self.do_somethingify!(str)
unless str.respond_to? :do_something
str.instance_eval do
def do_something
puts size
end
end
end
end
end