Arrays 在编译时连接字符串
我想在编译时加入文件名和图像格式。 下面的示例不起作用,因为我想字符串[]不能在编译时计算Arrays 在编译时连接字符串,arrays,string,d,ctfe,Arrays,String,D,Ctfe,我想在编译时加入文件名和图像格式。 下面的示例不起作用,因为我想字符串[]不能在编译时计算 immutable imageFormats = ["bmp", "jpg", "gif", "png"]; template fileNamesWithImageFormat(string[] fileNames) { string[] fileNamesWithImageFormat() { string[] ret; ret.length = imageFo
immutable imageFormats = ["bmp", "jpg", "gif", "png"];
template fileNamesWithImageFormat(string[] fileNames)
{
string[] fileNamesWithImageFormat() {
string[] ret;
ret.length = imageFormats.length * fileNames.length;
for (int j = 0; j < fileNames.length) {
for (int i = 0; i < imageFormats.length; ++i) {
ret[j * fileNames.length + i] = fileNames[j] ~ "." ~ imageFormats[i];
}
}
return ret;
}
}
我需要把这个输入到进口。如何解决该错误?进一步搜索后,它出现了。
从DMD2.061开始,这是一个bug,解决方法是将文件名声明为别名。进一步搜索后,它出现了。
从DMD2.061开始,这是一个bug,一个解决方法是将文件名声明为别名。这有点过于复杂了 CTFE编译时函数执行应该适合这里。您可以编写处理字符串[]输入的常用函数,并在编译时表达式中使用它。有一些限制,但是您的代码已经准备好CTFE了,所以不需要模板 您的索引中还有一个小错误。编译时工作的已更正版本:
import std.algorithm, std.array, std.range;
import std.stdio;
string[] modify(string[] names)
{
if (!__ctfe)
assert(false);
immutable string[] imageFormats = ["bmp", "jpg", "gif", "png"];
string[] ret;
ret.length = imageFormats.length * names.length;
for (int j = 0; j < names.length; ++j) {
for (int i = 0; i < imageFormats.length; ++i) {
ret[j * imageFormats.length + i] = names[j] ~ "." ~ imageFormats[i];
}
}
return ret;
}
enum string[] input = ["one", "two"];
pragma(msg, modify(input));
void main() {}
或者在DPaste上查看:
如果提供的代码中有不清楚的地方,或者您坚持使用其他方法,请在此处留下评论。D有很多不同的工具用于编译时任务。这有点过于复杂了 CTFE编译时函数执行应该适合这里。您可以编写处理字符串[]输入的常用函数,并在编译时表达式中使用它。有一些限制,但是您的代码已经准备好CTFE了,所以不需要模板 您的索引中还有一个小错误。编译时工作的已更正版本:
import std.algorithm, std.array, std.range;
import std.stdio;
string[] modify(string[] names)
{
if (!__ctfe)
assert(false);
immutable string[] imageFormats = ["bmp", "jpg", "gif", "png"];
string[] ret;
ret.length = imageFormats.length * names.length;
for (int j = 0; j < names.length; ++j) {
for (int i = 0; i < imageFormats.length; ++i) {
ret[j * imageFormats.length + i] = names[j] ~ "." ~ imageFormats[i];
}
}
return ret;
}
enum string[] input = ["one", "two"];
pragma(msg, modify(input));
void main() {}
或者在DPaste上查看:
如果提供的代码中有不清楚的地方,或者您坚持使用其他方法,请在此处留下评论。D为编译时任务提供了很多不同的工具。实际上阻止我使用正常函数的原因是,最初我在正文中也使用了import,我想这在常规函数中不起作用。感谢facepalm时刻。导入确实在函数中工作,但这是几个版本之前的一个新功能。实际上,阻止我使用正常函数的原因是,最初我在身体中也使用了导入,我想这在常规函数中不起作用。不过感谢facepalm时刻。虽然导入在函数中可以工作,但这是几个版本之前推出的新功能。