Например, в обычном блокноте или по распечатке на бумаге.
var result = service.GetAll().ToList()
Особенно во время дебага
А ты давай нормальные названия методам, чтобы возвращаемое значение было очевидным, набирайся опыта, ищи закономерности.
Ты же не задаёшься вопросом, какой тип возвращает какой-нибудь GetUser, ToString, TryParse, FirstOrDefault?
Если тебе сложно понять смысл кода без типов - значит кто-то плохие имена дал переменным.
Правильный вопрос - зачем вообще заставлять работать с анонимными типами? Подозреваю, что их из-за маршрутизации в MVC завезли - как типы параметров, вместо того, чтобы передавать в методы генерации ссылок вместо IDictionary, как это оно там реально требуется
use criterion::{criterion_group, criterion_main, Criterion};
use rand::Rng;
use std::{
hint::black_box,
time::{Duration, Instant},
};
fn count_odds(data: &[u8], even: &mut Vec<u8>, odd: &mut Vec<u8>) -> (usize, usize) {
let mut odd_count = 0;
let mut even_count = 0;
for i in data {
if i % 2u8 == 0u8 {
even_count += 1;
even.push(*i);
} else {
odd_count += 1;
odd.push(*i);
}
}
(even_count, odd_count)
}
fn create_test_data(size: usize) -> Vec<u8> {
let mut data = Vec::with_capacity(size);
let mut rng = rand::thread_rng();
for _ in 0..size {
let n: u8 = rng.gen();
data.push(n);
}
data
}
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("count_odds 1M", |b| {
b.iter_custom(|iters| {
let size = 1_000_000;
let data = create_test_data(size);
let mut total = Duration::default();
for _ in 0..iters {
let mut evens = Vec::with_capacity(size);
let mut odds = Vec::with_capacity(size);
let start = Instant::now();
let _ = count_odds(
black_box(&data[..]),
black_box(&mut evens),
black_box(&mut odds),
);
total += start.elapsed();
}
total
});
});
c.bench_function("count_odds 1K", |b| {
b.iter_custom(|iters| {
let size = 1_000;
let data = create_test_data(size);
let mut total = Duration::default();
for _ in 0..iters {
let mut evens = Vec::with_capacity(size);
let mut odds = Vec::with_capacity(size);
let start = Instant::now();
let _ = count_odds(
black_box(&data[..]),
black_box(&mut evens),
black_box(&mut odds),
);
total += start.elapsed();
}
total
});
});
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
мне это надо так как в цикле, char переводится в цифры(кодировку)
Ну или например с помощью среды разработки. По типу rfor
Ага и вот в этом самом "зависит" var будет играть меньшую роль.
Если у тебя в коде лапша типа такой: (тут фотография серверной, где откуда-то сверху свисает огромное количество перепутанных проводов), то "бирки" с типами у каждой переменной (или проводка в случае серверной) тебе не сильно помогут в понимании.
1. 4-5 лет - это не так уж и много
2. Читабельность зависит не от того, сколько людей потрогало код, а от процессов и правил, которые были приняты в проекте изначально. На каждый ужасный проект, который я видел - найдётся как минимум 1 очень даже неплохой.
Это как раз пример, когда использование явных типов у переменных не поможет, тк методы вызываются по цепочке. Как раз случай, когда нужно привыкать к паттернам, читать документацию, наводить мышку на методы.
Ой примеры - это в лучшем случае) Часто обходятся просто кратким summary. Наподобие "AddOptions - add options to service collection"
Далеко не только лишь.
Всякие ML-подобные-языки, включая F# и Haskell, Kotlin, Scala, Rust, zig, go - большинство из этих языков имеют очень опосредованное отношение к вебу и подходу "хуяк хуяк и в продакшен", но во всех них есть либо простой вывод типов по правой части выражения (как в C# и Go), так и полноценный хиндли-мильнер (F#), либо что-то среднее (Rust).
Где-то вывод типов прям необходим (из-за женериков), а где-то он просто чтобы меньше засорять код (типа го)