Size: a a a

2020 December 13

d

drjackild in Rust Beginners
Ребят, если у кого-нибудь найдется время и желание - посмотрите пожалуйста небольшой проект. Хотелось бы услышать замечания по поводу стиля написания, идеоматичности и прочего. Заранее очень благодарен: https://github.com/DrJackilD/cidrcalc
источник

K

Kitsu in Rust Beginners
drjackild
Ребят, если у кого-нибудь найдется время и желание - посмотрите пожалуйста небольшой проект. Хотелось бы услышать замечания по поводу стиля написания, идеоматичности и прочего. Заранее очень благодарен: https://github.com/DrJackilD/cidrcalc
Кажется для флагов нет каких-то предикатов (можно указать и cidr, и network например)
источник

d

drjackild in Rust Beginners
Kitsu
Кажется для флагов нет каких-то предикатов (можно указать и cidr, и network например)
Хорошее замечание, я тоже думал над тем, чтобы на две подкоманды разбить. Спасибо!
источник

a

antuan in Rust Beginners
как в рамках builder-pattern решается проблема с ожиданием вложенной структуры? Т.е. вот например, я делаю так: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9103a2d0ccbce8dd694a9ccba51c8a63

но это выглядит как-то не очень... если у меня десяток полей в итоге у Foo и все не Option, то проверять наличие всех десяти полей как-то многословно...
есть другой вариант?

#[derive(Default)] не катит
источник
2020 December 14

EG

Emmanuel Goldstein in Rust Beginners
antuan
как в рамках builder-pattern решается проблема с ожиданием вложенной структуры? Т.е. вот например, я делаю так: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9103a2d0ccbce8dd694a9ccba51c8a63

но это выглядит как-то не очень... если у меня десяток полей в итоге у Foo и все не Option, то проверять наличие всех десяти полей как-то многословно...
есть другой вариант?

#[derive(Default)] не катит
docs.rs/typed-builder не спасает?
источник

a

antuan in Rust Beginners
под капотом, судя по всему, делает то же самое...
ок, понял, спасибо
источник

EG

Emmanuel Goldstein in Rust Beginners
antuan
под капотом, судя по всему, делает то же самое...
ок, понял, спасибо
typed-builder никогда не паникует
источник

EG

Emmanuel Goldstein in Rust Beginners
Он в компайл-тайме проверяет всё
источник

a

antuan in Rust Beginners
Emmanuel Goldstein
typed-builder никогда не паникует
о, это интересно. у derive-builder такого вроде как нет
источник

АК

Алексей Кравченко... in Rust Beginners
Ivan Boldyrev
Грузить в буфер фиксированного размера, и считать разделители строк. Буфер любого размера, хоть 1 байт (но тогда будут накладные расходы на чтение больше).
Спасибо большое за идею! Отлично отработало заодно разобрался с буферами / ридерами.
источник

IB

Ivan Boldyrev in Rust Beginners
Алексей Кравченко
Спасибо большое за идею! Отлично отработало заодно разобрался с буферами / ридерами.
Пожалуйста! Тут я под буфером имею в виду явный кусок памяти, например, Vec<u8>, а не BufRead. Но у последнего есть методы fill_buf и consume, которые позволяют использовать его буфер!
источник

АК

Алексей Кравченко... in Rust Beginners
Ivan Boldyrev
Пожалуйста! Тут я под буфером имею в виду явный кусок памяти, например, Vec<u8>, а не BufRead. Но у последнего есть методы fill_buf и consume, которые позволяют использовать его буфер!
А если использовать BufReader::with_capacity?
источник

IB

Ivan Boldyrev in Rust Beginners
with_capacity позволяет просто задать нестандартный размер буфера.  А так разницы в подходе нет.
источник

IB

Ivan Boldyrev in Rust Beginners
С использованием крейта bytecount вариант с BufRead:
real    0m22,146s
user    0m1,296s
sys     0m5,899s

lines().count():
real    0m22,566s
user    0m10,148s
sys     0m5,388s

Вариант с BufRead без bytecount у меня получился столь же медленный, как lines().count(), при этом valgrind показал, что он аллоцировал лишь буфер (тогда как lines().count() аллоцировал дофига всего).

Вот так-то :)))
источник

Z

Zulqarnayn in Rust Beginners
Привет! Все таки решил изучить до конца раст. Установил по инструкции все работает. Но intellicense на vscode почему то нет. А вообще оно есть для раста?
источник

IB

Ilya Bogdanov in Rust Beginners
Zulqarnayn
Привет! Все таки решил изучить до конца раст. Установил по инструкции все работает. Но intellicense на vscode почему то нет. А вообще оно есть для раста?
поставь плагин rust-analyzer
источник

АК

Алексей Кравченко... in Rust Beginners
Ivan Boldyrev
С использованием крейта bytecount вариант с BufRead:
real    0m22,146s
user    0m1,296s
sys     0m5,899s

lines().count():
real    0m22,566s
user    0m10,148s
sys     0m5,388s

Вариант с BufRead без bytecount у меня получился столь же медленный, как lines().count(), при этом valgrind показал, что он аллоцировал лишь буфер (тогда как lines().count() аллоцировал дофига всего).

Вот так-то :)))
У меня получился вот такой код, обрати внимание что буфер с капасити.

Если честно работает в миллиард раз быстрее чем я ожидал.

У нас в питонах так не бывает :)

use std::io;
use std::io::BufReader;
use std::io::prelude::*;


pub fn run() -> std::io::Result<()> {
   let buf_capacity = 512;
   let stdin = io::stdin();
   let mut reader = BufReader::with_capacity(buf_capacity, stdin);
   let mut counter = 0;

   loop {      
       reader.fill_buf()?;
       counter += reader.buffer().iter().fold(0, |acc, x| if x == &10 { acc + 1 } else { acc });
       if reader.buffer().len() == 0 {
           break
       };
       reader.consume(buf_capacity);
   }
   println!("There is {} records", counter);
   Ok(())
}
источник

IB

Ivan Boldyrev in Rust Beginners
Алексей Кравченко
У меня получился вот такой код, обрати внимание что буфер с капасити.

Если честно работает в миллиард раз быстрее чем я ожидал.

У нас в питонах так не бывает :)

use std::io;
use std::io::BufReader;
use std::io::prelude::*;


pub fn run() -> std::io::Result<()> {
   let buf_capacity = 512;
   let stdin = io::stdin();
   let mut reader = BufReader::with_capacity(buf_capacity, stdin);
   let mut counter = 0;

   loop {      
       reader.fill_buf()?;
       counter += reader.buffer().iter().fold(0, |acc, x| if x == &10 { acc + 1 } else { acc });
       if reader.buffer().len() == 0 {
           break
       };
       reader.consume(buf_capacity);
   }
   println!("There is {} records", counter);
   Ok(())
}
Да, примерно так и у меня, просто я подсчитывал b'\n' по-другому (filter+count, что оказалось медленнее).

Буфер у тебя с capacity, но он всегда с capacity, и по умолючанию размер буфера -- 8Кб, а не 512 байт, вот и вся разница.
источник

IB

Ivan Boldyrev in Rust Beginners
Кстати, вместо явного 10 можно писать b'\n'.
источник

АК

Алексей Кравченко... in Rust Beginners
Да, это будет более читаемо. Спасибо!
источник