2015-05-13 2 views
1

Есть ли хороший способ превратить std.stdio.File во что-то, что является экземпляром потока от std.stream?Взаимосвязь между std.stdio.File и std.stream. *

Причина: Я нахожусь в поиске общей службы ведения журнала, работающей на потоках, и я хочу передать ее std.stdio.stderr, который является std.stdio.File.

+0

Обратите внимание: std.stream устарел. –

+0

@ColonelThirtyTwo Да, я видел, что тыкал еще немного. Черт позор, большая стандартная библиотека без потоков. Когда мы собираемся получить Tango для D2? –

+1

Используйте диапазоны вместо. Они похожи на потоки, но обобщены на большее, чем просто байты. См. Мой ответ. –

ответ

4

Вместо устаревшего модуля std.stream используйте диапазоны.

import std.stdio; 
import std.range; 
import std.algorithm; 
import std.typecons; 
import std.conv; 

// Log levels 
enum LEVEL { 
    DEBUG, 
    INFO, 
    WARN 
}; 
alias LogMsg = Tuple!(LEVEL, string); // Should be a struct, but I'm lazy 

void main() { 
    // Get a writer, which is an OutputRange 
    auto writer = stderr.lockingTextWriter(); 

    // Some messages. Can be any InputRange, not just an array 
    auto messages = [ 
     LogMsg(LEVEL.DEBUG, "Log message 1"), 
     LogMsg(LEVEL.INFO, "Log message 2"), 
     LogMsg(LEVEL.WARN, "Log message 3"), 
    ]; 

    // Write each message to the writer 
    put(writer, messages 
     // transform LogMsg's into strings to write. 
     // Bonus points: use chain instead of ~ to avoid allocation 
     .map!(msg => msg[0].to!string ~ ": " ~ msg[1] ~ "\n") 
    ); 
} 
+0

У диапазонов есть динамическая отправка какой-то? –

+0

@KarlDamgaardAsmussen Да, используйте обертки в [std.range.interfaces] (http://dlang.org/phobos/std_range_interfaces.html) –

2

вы можете использовать derr от cstream.

пример:

import std.stream; 
import std.cstream; 

void main() { 
    ubyte[] data = cast(ubyte[])"someData"; 
    OutputStream stream = derr; 
    stream.write(data); 
} 

Btw. существует logging module в стандарте D.