2014-01-05 3 views
2

Неужели кто-нибудь думал о реализации какой-либо постоянной сохранения данных (объекта) в D? Мое идеальное решение этой проблемы было бы что-то вроде:Автоматическое сохранение данных в D

@persistent int x = 1; 

Это работает наиболее seamelessly для статических переменных, но динамических также было бы невозможно.

Эти переменные будут храниться в базе данных хранилища ключей. Ключами могут быть отпечатки пальцев, основанные на имени и типе переменной области, а также некоторый дайджест загруженного в данный момент кода.

+0

вы хотите опубликовать это на [форуме цифровых марсов] (http://forum.dlang.org/group/digitalmars.D), а затем посмотреть, что они говорят, я не думаю, что они это сделают это по ряду причин. –

ответ

11

Вы можете сделать что-то похожее с шаблоном. Проверьте это:

import std.stdio; 

// do not declare two of these on the same line or they'll get mixed up 
struct persistent(Type, string file = __FILE__, size_t line = __LINE__) { 
    Type info; 
    alias info this; 

    // require an initializer 
    @disable this(); 

    // with the initializer 
    this(Type t) { 
     // if it is in the file, we should load it here 
     // else... 
     info = t; 
    } 
    ~this() { 
     // you should actually save it to the file 
     writeln("Saving ", info, " as key ", 
      file,":",line); 
    } 
} 

void main() { 
    persistent!int x = 10; 
} 

Если вы запустите ее, вы увидите initalizer и записи, и если вы заполнили файл резервного (возможно с помощью JSON ключей и значений, или какой-нибудь другой сериалайзер обрабатывать более типы), он должен быть в состоянии сохранить. Вы также можете сохранить dtor в глобальный буфер, а затем удалить деструктор модуля в файл (и конструктор модуля также загрузит файл), поэтому он не пытается читать/записывать файлы при каждом вызове функции.

Все переменные будут действовать так, как если бы они были статическими, так как вы можете видеть ключ здесь, это номер файла и строки декларации без экологического ввода. Но эй, это довольно просто и должно работать.

+0

Умный. Будьте здоровы. –

Смежные вопросы