2015-09-07 5 views
1

У меня есть много полезных функций в моих файлах рейка, некоторые из которых создают задачи рейка. Я хочу переместить эти служебные функции в модуль, чтобы избежать конфликтов имен, но когда я делаю, методы грабли больше недоступны.Как я могу вызвать методы рейка из модуля

require 'rake' 

directory 'exampledir1' 

module RakeUtilityFunctions 
    module_function 
    def createdirtask dirname 
     directory dirname 
    end 
end 

['test1', 'test2', 'test3'].each { |dirname| 
    RakeUtilityFunctions::createdirtask dirname 
} 

Ошибки я получаю:

$ rake 
rake aborted! 
undefined method `directory' for RakeUtilityFunctions:Module 
C:/dev/rakefile.rb:8:in `createdirtask' 
C:/dev/rakefile.rb:13:in `block in <top (required)>' 
C:/dev/rakefile.rb:12:in `each' 
C:/dev/rakefile.rb:12:in `<top (required)>' 

Насколько я могу сказать, метод каталога помещается на рубинового верхнего уровня по following code в Rake:

# Extend the main object with the DSL commands. This allows top-level 
# calls to task, etc. to work from a Rakefile without polluting the 
# object inheritance tree. 
self.extend Rake::DSL 

Есть ли простой способ вызова функций, которые были размещены на верхнем уровне?

ответ

1

Я понял это сейчас. С помощью @ReggieB я обнаружил этот вопрос: ways to define a global method in ruby.

В нем содержится отрывок из журнала смены грабли.

Если вам нужно вызвать 'task: xzy' внутри вашего класса, включите Rake :: DSL в класс.

Таким образом, самый простой способ сделать это, чтобы расширить модуль с Rake :: DSL:

require 'rake' 

directory 'exampledir1' 

module RakeUtilityFunctions 
    self.extend Rake::DSL  ### This line fixes the problem! 
    module_function 

    def createdirtask dirname 
     directory dirname 
    end 
end 

['test1', 'test2', 'test3'].each { |dirname| 
    RakeUtilityFunctions.createdirtask dirname 
} 
1

Когда вы определяете модуль, код внутри этого модуля имеет новую область.

Таким образом, directory в пределах RakeUtilityFunctions отличается от кода верхнего уровня.

Как вы еще не определили directory в пределах RakeUtilityFunctions вы получаете неопределенную ошибку метода.

Обратите внимание на раздел «Вращающиеся ворота» this article.

+0

Спасибо за ответ @ReggieB. С вашей помощью я нашел еще один вопрос о подобной проблеме, см. Мой ответ. – Eoghan

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