0

我必须使用探戈。

我从文件中读取一个文本,该文本是对 char[] 表的指令。然后我需要通过mixin来执行它。mixin 作为参数需要字符串或 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[] 它不是那么如何使它工作?:<

4

1 回答 1

2

char[]const char[]隐式转换为。不需要演员表。

auto foo(const char[]) {...}

auto foo(const(char)[]) {...}

都将接受char[]- char[]const(char)[]immutable(char)[]const char[]和的任何可变性变化immutable char[]。通常,可变和immutable隐式转换为const

编辑(添加到问题的代码后添加):

实际上,我对您的第二行编译感到震惊。const这与vs mutable无关。这与编译时与运行时有关。您传递给 a 的字符串mixin必须在编译时知道。通常,这意味着使用函数返回字符串(在这种情况下,它被称为 CTFE 的一部分)或使用枚举(在编译时已知)。变量在编译时是未知的,因此通常不能使用。但是,您的const版本很幸运,因为编译器知道该值永远不会改变,并且该值是直接初始化的,因此它知道它是什么,并且让您侥幸逃脱。如果你有

const char[] tab2 = foo();

foo返回了您想要使用的字符串,该字符串mixin将无法像第一个那样编译。

mixin 的字符串通常应该直接传递给 mixin,从函数(被称为 CTFE 的一部分)返回,或者是一个枚举。

如果要将文件的内容放在 a 中mixin,则需要使用字符串导入。例如

mixin(import("foo.txt"));

并且您需要告诉编译器在使用标志时可以找到foo.txt的哪个目录。-J

于 2013-06-03T00:07:26.627 回答