2015-06-11 3 views
-1

У меня есть очень простой модуль, Utility, определенный в utility.rb в каталоге lib приложения rails. Он просто добавляет два простых метода к классам из стандартной библиотеки Ruby.Добавление методов к базовому классу ruby ​​в rails

Однако, когда I require этот файл, классы внутри него не отвечают методам, которые я здесь определил. Например, [].concat_with не работает с NoMethodError. Зачем?

module Utility 

    # 
    # This module just contains useful functions 
    # 

    class Array 
    def concat_with(seperator = "") 
     reject! { |c| c.empty? }.join(seperator) 
    end 
    end 

    class Float 
    def flat 
     "%gx" % (self/100.00) 
    end 
    end 

end 

ответ

4

Это потому, что вы определили новые классы, а не исправляли существующие. Эти классы: Utility::Array и Utility::Float. В module -что все в объеме модуля.

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

module Utility 

    # 
    # This module just contains useful functions 
    # 

    refine Array do 
    def concat_with(seperator = "") 
     reject! { |c| c.empty? }.join(seperator) 
    end 
    end 

    refine Float do 
    def flat 
     "%gx" % (self/100.00) 
    end 
    end 

end 

Тогда вы:

using Utility # Obviously, it has to be `required` 
puts 3.14.flat 

И эти методы будут существовать только в текущий объем. Когда вы выйдете на улицу, они исчезнут.

Конечно, вы можете ссылаться на классы из вне модуля, например, так:

module Utility 

    # 
    # This module just contains useful functions 
    # 

    class ::Array 
    def concat_with(seperator = "") 
     reject! { |c| c.empty? }.join(seperator) 
    end 
    end 

    class ::Float 
    def flat 
     "%gx" % (self/100.00) 
    end 
    end 

end 

Но что написать бы изменения постоянно (процесс-накрест). Иногда это может быть желательно, но я избегаю этого, если это абсолютно необходимо, поскольку это может легко противоречить изменениям, внесенным другими библиотеками.

Смежные вопросы