Уточнить ответ Accordion Guy:
Уведомление, что Proc.new
создает proc, будучи переданным блок. Я полагаю, что lambda {...}
анализируется как своего рода литерал, а не вызов метода, который передает блок. return
луг из блока, присоединенного к вызову метода, возвратится из метода, не блока, и Proc.new
, случай является примером этого приведенного в действие.
(Это 1.8. Я не знаю, как это переводит в 1,9.)
В C ++ под Linux глобальные переменные создаются автоматически, как только библиотека загружается. Так что это, вероятно, самый простой путь.
Если вам нужно вызвать произвольную функцию при загрузке библиотеки, используйте атрибут конструктора для GCC:
__attribute__((constructor)) void foo(void) {
printf("library loaded!\n");
}
Функции конструктора вызываются динамическим компоновщиком при загрузке библиотеки . Именно так и реализована глобальная инициализация C ++.
Если вы хотите, чтобы ваш код был переносимым, вам, вероятно, следует попробовать примерно так:
namespace {
struct initializer {
initializer() {
std::cout << "Loading the library" << std::endl;
}
~initializer() {
std::cout << "Unloading the library" << std::endl;
}
};
static initializer i;
}
Использование глобального (или локально-статического, заключенного в функцию) - это хорошо ... но затем вы попадаете в страну фиаско статической инициализации (и фактическое разрушение тоже не очень приятно) .
Я бы порекомендовал взглянуть на реализацию Loki Singleton .
Существуют различные политики времени жизни, одна из которых - Phoenix
, которая поможет вам избежать этого. фиаско.
Когда вы это сделаете, прочтите Modern C ++ Design, в котором подробно объясняются проблемы, с которыми сталкивается синглтон, а также способы использования различных политик.