Хоча Руст дуже і дуже рідко є конкурентоспроможним у змаганнях з коду з гольфу (Java часто коротше), все-таки можна потішити гольф. Які кілька хитрощів для скорочення коду Rust?
Будь ласка, опублікуйте лише одну пораду в кожній відповіді.
Хоча Руст дуже і дуже рідко є конкурентоспроможним у змаганнях з коду з гольфу (Java часто коротше), все-таки можна потішити гольф. Які кілька хитрощів для скорочення коду Rust?
Будь ласка, опублікуйте лише одну пораду в кожній відповіді.
Відповіді:
Закриття:
|n|n+1
коротше функції:
fn f(n:i32)->i32{n+1}
Закриття, довше одного твердження, потребує дужок, але все ще набагато коротше функції.
Скажімо, у вас є х, який реалізує ознаку IntoIterator, і вам потрібно викликати функцію f, яка приймає індекс елемента і посилання на нього. Стандартний спосіб зробити це
x.iter().enumerate().map(f)
натомість ви можете робити
(0..).zip(x).map(f)
і заощадите не тільки незвично довгий перелік, але і заклик до нього!
Якщо вам потрібно багато змінних змінних, це може витратити багато місця, оголосивши їх та ініціалізуючи їх, оскільки для кожного потрібне ключове слово mut, і ви не можете зробити нічого, як a = b = c = 0. Тоді рішення - оголосити масив, що змінюється
let mut a=[0;5];
Ви витрачаєте 3 зайвих байта щоразу, коли використовуєте їх у порівнянні зі звичайною змінною:
a[0]+=1;
але часто це все-таки може бути вартим.
Використання кортежів для одного і того ж трюку часто є ще кращим варіантом:
let mut t=(1,4,"this", 0.5, 'c');
Це має перевагу в збереженні байта при кожному використанні порівняно з масивом:
t.0=2
Це також дозволяє їм бути різного типу. З іншого боку, для ініціалізації потрібно більше символів.
&str
наString
Ніколи цього не робіть:
s.to_string() // 13 bytes
s.to_owned() // 12 bytes
Це завжди коротше:
s.repeat(1) // 11 bytes
Якщо s
це рядковий літерал:
format!(s) // 10 bytes
Наприклад: використовуйте format!("")
замість того, String::new()
щоб зберегти 2 байти.
Якщо умовивід типу працює:
s.into() // 8 bytes
При використанні print!()
форматного рядка, наприклад, з , можна використовувати як нумеровані, так і ненумеровані формати, щоб зберегти один байт на один елемент у форматі:
Найкраще показано на прикладі:
fn main(){
print!("{}{}{}. Yes, {0}{}{2}. All you other{1}{2}s are just imitating.",
"I'm",
" Slim",
" Shady",
" the real");
}
Які виходи:
I'm Slim Shady. Yes, I'm the real Shady. All you other Slim Shadys are just imitating.
Таким чином, ненумеровані форматори будуть присвоюватися елементам в порядку, це дозволяє пропустити індекс на них. Зауважте, що для форматування ви можете використовувати лише один ненумерований формат на один елемент, після чого він звикне.
Розглядаючи різні речі, я думаю, що це, як правило, найкоротший спосіб отримати рядок. У рядку є нова лінія, її можна видалити обрізанням ( .trim()
) або, якщо цього неможливо зробити, нарізавши.
let y=&mut"".into();std::io::stdin().read_line(y);
Для декількох рядків lines
може бути використаний ітератор, ітераційний рядок не закінчується новим рядком. Для імпорту потрібен глобальний імпорт BufRead
, необхідний для того, lines
щоб бути доступним для StdinLock<'_>
типу.
use std::io::*;let y=stdin();y.lock().lines()
У функціях, що повертаються ()
, де останній вираз також типу ()
, вам не потрібно ;
:
fn main(){print!("Hello, world!")}