2013-06-02 3 views
0

Я должен использовать танго.D - литье char [] to const char []

Im чтение из файла текста, который является инструкцией в таблице 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 символ [] он работает, отправляя стандартный символ [] это не так как заставить его работать? : <

+0

Ответ Джонатана приведен ниже. Вы можете узнать об этом подробнее, http://ddili.org/ders/d.en/const_and_immutable.html – yaz

ответ

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 в целом.

EDIT (добавление после кода добавляется к вопросу):

На самом деле, я в шоке, что ваша вторая строка компилирует. Это не имеет никакого отношения к const vs mutable. Это связано с временем компиляции и временем выполнения. Строки, которые вы передаете в mixin, должны быть известны во время компиляции. Обычно это означает использование функции для возврата строки (в этом случае она называется частью CTFE) или с использованием перечисления (которое было бы известно во время компиляции). Переменные не известны во время компиляции и поэтому обычно не могут использоваться. Тем не менее, вам повезло с вашей версией const, потому что компилятор знал, что значение никогда не изменится, и значение было напрямую инициализировано, поэтому оно знало, что это было, и это позволяет вам уйти от него. Если вы имели

const char[] tab2 = foo(); 

и foo возвратил строку, которую хотел использовать, что mixin не смогли бы собрать так же, как первый на.

Строки для миксинов должны либо непосредственно передаваться в смеситель, возвращенные из функции (которая называется частью CTFE), либо быть перечислением.

Если вы хотите поместить содержимое файла в mixin, вам необходимо использовать импорт строки. например

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

И вы должны сообщить компилятору, что каталог, чтобы найти foo.txt в использовании -J флага.

+0

@CSharpBeginner Обновлено с информацией о чтении из файла. –

+0

Я сомневаюсь, что вы использовали бы папку C:/dmd/windows/bin для хранения файлов с помощью некоторого кода, который вы хотите микшировать ... Возможно, это было бы где-то еще. – DejanLekic

+0

У меня проблема с установкой этого флага -J:/Я получил файл «test.d» с кодом, где я получил mixin (import («tekst.txt»)) и еще один файл «tekst.txt», где я получил простой цикл , Эти 2 файла, которые я получил в одном каталоге «C: \ dmd \ windows \ bin». Когда я пытаюсь скомпилировать и использовать -J следующим образом: «dmd test.d -Jpath = C: \ dmd \ windows \ bin "Я получил ошибку, вызванную" файл tekst.txt не может быть найден или нет в пути, указанном с -J ", любые подсказывают, почему это происходит? – CSharpBeginner