Я хотел бы узнать, точно что переменные доступны при использовании zc.buildout. Я могу всегда смотреть на источник, но идеально я нашел бы список где-нибудь или смог бы запросить buildout для обнаружения то, что он думает, переменные, доступные в любой момент. Действительно ли это возможно?
Я никогда не был в восторге от этого решения. Для одного, это не обязательно очевидно, где все такие методы в коде, для другого, я просто не люблю синтаксис. Я хочу использовать. когда я вызываю методы!
И я хочу использовать $! --- &
при вызове методов! Разберись. Если вы собираетесь написать код C++, придерживайтесь условных обозначений C++. И очень важным соглашением C++ является предпочтение функций, не являющихся членами, когда это возможно.
Есть причина, по которой гуру C++ рекомендуют это:
Это улучшает инкапсуляцию, расширяемость и повторное использование. ( std:: sort
может работать со всеми парами итераторов , поскольку не является членом какого-либо одного класса итераторов или контейнеров. И как бы вы ни расширяли std:: Последовательностью
, вы не можете ломать его, пока придерживаетесь не-членских функций. И даже если у вас нет доступа к исходному коду класса или вам не разрешено его изменять, вы все равно можете расширить его, определив функции, не являющиеся членами класса)
Лично я не вижу точки в вашем коде. Разве это не намного проще, понятнее и короче?
string OperateOnString( float num, string a, string b )
{
string nameS;
Format(nameS, "%f-%s-%s", num, a.c_str(), b.c_str() );
return nameS;
}
// or even better, if `Format` is made to return the string it creates, instead of taking it as a parameter
string OperateOnString( float num, string a, string b )
{
return Format("%f-%s-%s", num, a.c_str(), b.c_str() );
}
Когда в Риме, делайте, как римляне, как говорится. Особенно , когда у римлян есть веские причины поступать так, как у них есть. И особенно когда ваш собственный способ сделать это на самом деле не имеет ни одного преимущества. Он более подвержен ошибкам, сбивает с толку людей, читающих ваш код, не является идиоматическим, и это просто больше строк кода, чтобы сделать то же самое.
Что касается вашей проблемы, трудно найти функции, не являющиеся членами, которые расширяют последовательности
, поместите их в пространство имен, если это связано. Для этого они и нужны. Создайте пространство имен StringUtil
или что-то подобное и поместите их туда.
Изменение ответа Фредди при использовании MVC - пришлось использовать:
HttpContext.User.Identity.Name
Незначительное изменение, но я подумал, что опубликую его в случае, если кто-то еще попытается сделать это в MVC попадет в ту же загвоздку.
-121--2890584- Это не самый красивый список, но вы можете посмотреть на .installed.cfg
в каталоге buildout.
Для каждой детали отображаются опции, о которых она знает. (Почему-то несколько частей часто показываются несколько раз).