Поради щодо гольфу в Русті


24

Хоча Руст дуже і дуже рідко є конкурентоспроможним у змаганнях з коду з гольфу (Java часто коротше), все-таки можна потішити гольф. Які кілька хитрощів для скорочення коду Rust?

Будь ласка, опублікуйте лише одну пораду в кожній відповіді.

Відповіді:


12

Використовуйте закриття замість функцій

Закриття:

|n|n+1

коротше функції:

fn f(n:i32)->i32{n+1}

Закриття, довше одного твердження, потребує дужок, але все ще набагато коротше функції.


9

Уникайте .iter (). Перераховувати ()

Скажімо, у вас є х, який реалізує ознаку IntoIterator, і вам потрібно викликати функцію f, яка приймає індекс елемента і посилання на нього. Стандартний спосіб зробити це

x.iter().enumerate().map(f)

натомість ви можете робити

(0..).zip(x).map(f)

і заощадите не тільки незвично довгий перелік, але і заклик до нього!


8

Якщо вам потрібно багато змінних змінних, це може витратити багато місця, оголосивши їх та ініціалізуючи їх, оскільки для кожного потрібне ключове слово 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

Це також дозволяє їм бути різного типу. З іншого боку, для ініціалізації потрібно більше символів.


4

Перетворення &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

4

При використанні 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.

Таким чином, ненумеровані форматори будуть присвоюватися елементам в порядку, це дозволяє пропустити індекс на них. Зауважте, що для форматування ви можете використовувати лише один ненумерований формат на один елемент, після чого він звикне.


3

Читання рядків

Розглядаючи різні речі, я думаю, що це, як правило, найкоротший спосіб отримати рядок. У рядку є нова лінія, її можна видалити обрізанням ( .trim()) або, якщо цього неможливо зробити, нарізавши.

let y=&mut"".into();std::io::stdin().read_line(y);

Для декількох рядків linesможе бути використаний ітератор, ітераційний рядок не закінчується новим рядком. Для імпорту потрібен глобальний імпорт BufRead, необхідний для того, linesщоб бути доступним для StdinLock<'_>типу.

use std::io::*;let y=stdin();y.lock().lines()

3

Пропуск проміжків з комою

У функціях, що повертаються (), де останній вираз також типу (), вам не потрібно ;:

fn main(){print!("Hello, world!")}

2

Працюючи з рядками з новими рядками в них, ви зберігаєте один байт, якщо ви використовуєте буквальний розрив рядка у вихідному коді та маючи a \nв рядку.

println!("Hello
World!");

на 1 байт менше:

println!("Hello\nWorld!);

2

Використовуючи номери з плаваючою комою з цілим числом, ви можете опустити трейлінг, .0щоб зберегти один байт.

let a=1.

на 1 байт менше:

let a=1.0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.