Трубчатый фильтр - это программа для падения между Unix-трубами: source | filter | sink
. Я бы хотел, чтобы он делал как можно меньше буферизации и обрабатывал вещи по мере их поступления, а не читал все и только начинал обрабатывать данные на EOF
.Как написать фильтр трубы в Rust?
Я очень новичок в Rust, и это учебный проект. Вся вещь фильтра для труб предназначена для того, чтобы я мог играть с строковой обработкой в командной строке и возникает из-за необходимости получать несаминированный JSON от conky и очищать его для i3bar.
Вот что у меня есть. Он не выполняет никакой обработки и должен просто сбрасывать stdin в stdout.
Я не уверен, будет ли read_line()
блокироваться до тех пор, пока не будет найден символ новой строки, и как проверить, вернул ли он что-то, с чем я могу работать. Я знаю, что он возвращает IoResult
, но я не смог узнать, как сделать матч против него. Кажется, в этом контексте используется макрос try!
, но я не уверен, как это сделать.
Когда он достигает звонка sleep()
, он, кажется, спит бесконечно.
use std::io;
use std::io::timer;
use std::time::Duration;
fn main() {
let mut reader = io::stdin();
let interval = Duration::milliseconds(1000);
let mut line;
loop {
line = reader.read_line();
print!("{}", line);
timer::sleep(interval);
}
}
Вам, в конечном счете, придется выбирать, что вы подразумеваете под «эффективным». Если вы делаете «как можно меньше буферизации», тогда вы будете использовать меньше памяти, но, возможно, больше времени процессора или пользователя. Обычно вы можете быть эффективными в одной области, а не в другой. – Shepmaster
Ваш код кажется достаточно эхо-вывода для вывода (кроме 'line' является результатом, поэтому вывод завернут в' Ok' или 'Err') – Shepmaster
Плохая формулировка с моей стороны. С «эффективным» я имел в виду «не буферизует навсегда», а не ресурсоэффективно. – mkaito