我目前正在使用Mojolicious开发一个小型单页Web应用程序.该应用程序有一个Javascript前端(使用Backbone)与REST-ish API对话; 源的布局大致是:
use Mojolicious::Lite;
# ... setup code ...
get '/' => sub {
my $c = shift;
# fetch+stash data for bootstrapped collections...
$c->render('app_template');
};
get '/api_endpoint' => sub {
my $c = shift;
# fetch appropriate API data...
$c->render(json => $response);
};
# ... more API endpoints ...
app->start;
Run Code Online (Sandbox Code Playgroud)
应用程序模板使用EP,但非常简单; 唯一的服务器端模板指令只是为引导的集合插入JSON.它通过Apache作为普通的CGI脚本部署.(这不是最佳选择,但它适用于低流量内部使用,更复杂的服务器配置在上下文中存在问题.)Perl CGI通过配置mod_perl.
这在大多数情况下都有效,但偶尔渲染器会以某种方式获得它应该缓存模板并忽略对它的更改的想法.调试记录error_log显示"渲染缓存模板"而不是普通的"渲染模板",我对模板的新更改停止显示在浏览器中.我找不到一种可靠的方法来阻止它,尽管它最终会根据我无法辨别的条件自行停止.
如何使应用程序通知模板可靠地更改?或者,如何完全禁用模板缓存?
在可用的C++中,最好使用auto许多变量,特别是那些类型已知但输入很烦人的变量:
weird_template_type<int,char>::subtype::recursive_subtype some_function() {
// ...
}
// ...
auto val = some_function();
Run Code Online (Sandbox Code Playgroud)
当有意义时,例如对于锁定,对RAII对象使用微范围也是很好的:
some_setup_code();
int val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
Run Code Online (Sandbox Code Playgroud)
有没有办法混合这两个习语,例如当你的共享内存读取代码返回一个奇怪的类型?
明显的版本不起作用:
auto val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
Run Code Online (Sandbox Code Playgroud)
由于auto没有初始化程序的变量,这在编译时失败.
同样,您不能在范围块内声明变量,否则以后就无法使用它.
我能看到的唯一直接选项是1.明确地输出变量声明(bleah),或者2.使用auto其他一些你知道属于同一类型的表达式(不是改进).还有其他方法吗?