gpt4 book ai didi

d - 使用 response.render 渲染模板文件时,使用 Vibe.d 的变量

转载 作者:行者123 更新时间:2023-12-04 09:32:31 24 4
gpt4 key购买 nike

目前我正在使用 Vibe.d制作一个网站,其中有一个 Response 类,用于处理每个请求。看起来像这样:

import vibe.d;

void index(HTTPServerRequest req, HTTPServerResponse res)
{
res.render!("index.dt", req);
}

shared static this()
{
auto router = new URLRouter;
router.get("/", &index);

auto settings = new HTTPServerSettings;
settings.port = 8080;

listenHTTP(settings, router);
}

在示例中,我将 const string "index.dt 传递给 res.render! 方法,但我想要传递一个变量:

void render(string action, HTTPServerResponse res) {
res.render!(action);
}

但是我得到以下错误:

Error: variable action cannot be read at compile time

在我调用 render 的每个地方,我都硬编码了字符串:

render("foo.dt");

但这并不能满足编译器的要求。知道我如何才能完成这项工作吗?

最佳答案

虽然原则上不可能使用运行时变量(这基本上需要在运行时编译 D 代码),但您可以使用编译时定义的 enum 常量或模板参数来避免直接使用字符串常量:

void index(string templ)(HTTPServerRequest req, HTTPServerResponse res)
{
res.render!(templ, req);
}

shared static this()
{
// ...
router.get("/", &index!"index.dt");
// BTW, this special case is equal to
//router.get("/", staticTemplate!"index.dt");
// ...
}

或使用枚举:

enum indexTemplateFile = "index.dt";

void index(HTTPServerRequest req, HTTPServerResponse res)
{
res.render!(indexTemplateFile, req);
}

也可以使用这种使用命名 enum 的替代形式:

enum TemplateFile {
index = "index.dt",
login = "login.dt"
}

void index(HTTPServerRequest req, HTTPServerResponse res)
{
res.render!(TemplateFile.index, req);
}

这两种方法也可以结合起来,甚至可以用通常的字符串操作修改常量,只要结果仍然可以在编译时计算(例如,可以调用类似 std.在将字符串传递给 render 之前在字符串上添加 string.toLower

关于d - 使用 response.render 渲染模板文件时,使用 Vibe.d 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22870859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com