我必须使用探戈。
我正在从文件中读取一个文本,这是一个指向char []表的指令。然后我需要通过mixin执行它。 mixin作为参数需要string或const char []。如何将char []转换为const char []?
import tango.io.Stdout;
import tango.io.Console;
void main(char[][] args)
{
int x = 3;
char[] tab = "x = 5;";
mixin(tab); // throw error
const char[] tab2 = "x = 5;";
mixin(tab2); // here it's ok
}
错误:错误:mixin的参数必须是字符串,而不是(制表符)
我知道它必须是字符串,但发送const char []它正在工作,发送标准char []它不是如此使它工作? :其中
答案 0 :(得分:2)
char[]
隐含地投射到const char[]
。不需要演员表。
auto foo(const char[]) {...}
auto foo(const(char)[]) {...}
将同时接受char[]
- char[]
,const(char)[]
,immutable(char)[]
,const char[]
和immutable char[]
的任何可变性变体。 mutable和immutable
一般都会隐式转换为const
。
编辑(添加到问题代码后添加):
实际上,我很震惊你的第二行编译。这与const
vs mutable无关。这与编译时与运行时有关。传递给mixin
的字符串必须在编译时知道。通常,这意味着使用函数返回字符串(在这种情况下,它被称为CTFE的一部分)或使用枚举(在编译时可以知道)。变量在编译时是未知的,因此通常不能使用。但是,你幸运的是你的const
版本,因为编译器知道值永远不会改变,并且值是直接初始化的,所以它知道它是什么,它让你逃脱它。如果你有
const char[] tab2 = foo();
并且foo
已经返回了您想要使用的字符串,mixin
将无法像第一个那样编译。
mixin的字符串通常应直接传递给mixin,从函数返回(称为CTFE的一部分),或者是枚举。
如果要将文件的内容放在mixin
中,则需要使用字符串导入。 e.g。
mixin(import("foo.txt"));
您需要告诉编译器在使用-J
标志时找到 foo.txt 的目录。