Почему мы называем макрос vec, используя квадратные скобки вместо скобок, с которыми он определен? - PullRequest
3 голосов
/ 05 июня 2019

Я изучаю макросы Rust и запутался в синтаксисе при использовании vec.Исходный код , реализующий vec!:

macro_rules! vec {
    ($elem:expr; $n:expr) => (
        $crate::vec::from_elem($elem, $n)
    );
    ($($x:expr),*) => (
        <[_]>::into_vec(box [$($x),*])
    );
    ($($x:expr,)*) => (vec![$($x),*])
}

Давайте забудем стандартный способ его использования:

let v0 = vec![1, 2, 3];

Если мы посмотрим на исходный код,Разве мы не используем его, как показано ниже?

let v1 = vec!(3; 1);
let v2 = vec!(1, 2, 3); 

Почему мы используем [] вместо () в v1 и v2 по сравнению с v0?

1 Ответ

4 голосов
/ 05 июня 2019

Как вы заметили, вы можете использовать скобки, квадратные скобки или фигурные скобки для вызова макроса:

let a = vec!(0, 1, 2);
let b = vec![0, 1, 2];
let c = vec! { 0, 1, 2 };

Макросам не важно, какой из этих синтаксисов вы используете 1 . Программисты заботятся о том, какой синтаксис вы используете.

В массиве и синтаксисе Rust используются квадратные скобки, и Vec s тесно связаны с ними обоими.Использование квадратных скобок для построения Vec - это просто соглашение о языке.Rustfmt автоматически преобразует вызовы в vec! в квадратные скобки.


1 - существует небольшое взаимодействие между тем, какой стиль скобок вы используете при вызове макроса и точки с запятой.Макрос, используемый как оператор item или , должен заканчиваться точкой с запятой, если он не использует фигурные скобки:

macro_rules! dummy {
    () => {};
}

// Not OK
dummy!()

// OK
dummy! {} 

// OK
dummy!();
...