2016-06-04 6 views
0

У меня есть драгоценный камень (например, mygem), и, как обычно, я добавляю mygem в файл, помещая require "mygem" наверху. Что делать, если у меня есть метод в mygem называется finish_jobs, и я хочу, чтобы запустить в следующем месте:Как запустить метод в конце файла из драгоценного камня?

require "mygem" 
# code, code code 
finish_jobs 

Как бы я, что не заставляя пользователя, чтобы добавить метод каждый раз, когда они используют камень?

В частности, то, что я пытаюсь сделать, это написать серверное приложение (со стойкой), и мне нужно, чтобы методы в теле файла обрабатывались до запуска сервера.

+0

«Код кода», где вы начинаете свой сервер? –

+0

«code code code» был бы установкой различных частей моего сервера, который должен быть настроен, прежде чем я начну его запускать. – thesecretmaster

+0

Мне кажется, что вы должны написать config.rb, который делает то, что вам нужно, и реорганизуйте это. –

ответ

1

Это, безусловно, возможно.

Почему бы просто не добавить код непосредственно в Gem (так как это похоже на то, что он находится под вашим контролем и не является внешней зависимостью)?

module MyGem 
    def printSomething 
    p 2 + 2 
    end 

    module_function :printSomething 
    printSomething() 
    # => 4 
end 

Если это не то, что вы имели в виду, сообщите мне, и я могу обновить решение.

Также см Kernel#at_exit
более описательный руководство по Kernel#at_exit

+0

другой возможностью было бы проверить возврат из 'main' или любого другого глобального объекта (где написан код) - хотя имейте в виду, что его имя будет меняться в зависимости от того, где оно выполняется (irb и т. Д.) – Trajanson

0

Я не знаю способ сделать то, что вы описываете.

Одним из способов решения проблемы было бы предоставление API, который принимает блок. Этот подход позволяет вам запустить код после настройки пользователя, не подвергая им детали реализации.

пользователь может назвать свой метод библиотеки, обеспечивая блок для настройки своего сервера:

require "mygem" 

MyGem.code_code_code { 
    # user's code goes here 
} 

Тогда ваша библиотека будет:

  • Accept блока
  • вызова некоторые библиотеки код

Вот пример реализации:

module MyGem 
    # Run some user-provided code by `yield`-ing the block 
    # Then run the gem's finalizer 
    def self.code_code_code 
    # Execute the block: 
    yield 
    # Finalize: 
    finish_jobs 
    end 
end 

Таким образом, вы можете принимать код от пользователя, но все же контролировать настройку и завершение.

Надеюсь, это поможет!

+0

есть ли способ сделать это, если у меня есть несколько блочных методов, а затем, после выполнения кода, запустите мою функцию? – thesecretmaster