2401d,d的插值串,1027与1036哪个好

原文
我问了个问题,添加模板调用是否构成"过度"负担.很明显,这表明正在调整i串的默认行为.

使用DIP1036串插值,表明用它调用sql:
1.如果在全局导入了core.interpolation以外的内容,它会应用至该模块中i串所有用户,而不仅是调用SQL函数的用户.

即,用i串s调用writeln不会执行期望操作,且在视觉上查看代码并不明显,编译器也无法检查.

2.或在本地导入core.interpolationarsd.sqlite,以满足每次域使用i串s.
感谢你的澄清.我确实误解了它.

因此,即db.execi()是调整调用sql模板.我以为它是sqlapi的一部分,而不是包装器.

这使得它在这方面与DIP1027一样.

不必用标记来说明参数字面还是变量.考虑:

import std.stdio;
void main()
{
    
    
    writeln("hello".stringof);
    string foo = "betty";
    writeln(foo.stringof);
}

运行时,打印:

"hello"
foo

因此,用.stringof,模板可确定元组元素是串字面还是变量.

表明,这对DIP1036来说,也是个问题,因为db.execi()是模板.我没有发现这一点.

显然,对用户来说,DIP1027并不比DIP1036更难.

目前,D内部支持按元组对待非平凡式.DIP1027依赖于此,如:

int i = 4;
writefln(i"hello $(3 + i)");

打印:

hello 7

但是,如果用以下命令创建元组:

template tuple(A ...) {
    
     alias tuple = A; }

则就不能传递非平凡式给它,因为不能按别名参数对待它.这是D中的普遍缺点,而不是DIP1027特定问题.

一直在以下方向发展:

auto tup = (1, 3 + i);

也是因此弃用逗号式.
有趣的是,可用i串来创建非平凡的式元组:

int i = 4;
auto tup2 = i"$i $(3 + i)"[1..3];
writeln("a tuple: ", tup2);

打印:

a tuple: 47

我不推荐这样,但它只是说明了i串是个构建块而不是最终产品.

至于检测串字面,我试了一些方案,但没用.它可能必须添加一个__traits,来放这些东西.

试使用DIP1036表明要向元组添加更多必须过滤掉的项.

嵌套的i串会执行期望操作,在元组中创建一个会变平的元组.最终会遇见格式参数太多编译时错误.
i串只是简单地转换元组,之后,遵循可预测元组规则.

但是,总是可按参数插入嵌套的i串到扩展它为单个参数,且无元组问题的text函数中.

总之,D应朝着更好的元组支持方向发展.DIP1027``正好符合这一点,因为它没有神奇.更好元组支持,适合扩展i串功能,而不是使i串自身更强大.

int x=readln.strip.split.to!int;
db.execi(xxx!i"INSERT INTO sample VALUES ($(id), $(2*x))");

2*x不能转为别名,我要想一下.

猜你喜欢

转载自blog.csdn.net/fqbqrr/article/details/135451920