Повторение макроса ржавчины с плюсом - PullRequest
2 голосов
/ 12 февраля 2020

Как оператор + можно использовать в качестве разделителя повторений?

fn dot(self, rhs: Self) -> S {
    $(self.$s * rhs.$s)++
}

$s будет x, y, z, поэтому я хотел бы, чтобы макрос Exapnd до self.x * rhs.x + self.y * rhs.y + self.z * rhs.z. Если я напишу $(self.$s * rhs.$s)-+, то это сработает и расширится до вычитаний, но мне нужны дополнения, возможно ли экранировать токен +?

1 Ответ

2 голосов
/ 12 февраля 2020

К сожалению, это невозможно напрямую (по состоянию на ржавчину c 1,41). Обходной путь, упомянутый в этой проблеме, состоит в том, чтобы ставить плюс перед каждым элементом в повторении и иметь отдельный макрос, который удаляет дополнительный плюс на фронте.

macro_rules! strip_plus {
    (+ $($rest: tt)*) => {
        $($rest)*
    }
}

Используется так:

macro_rules! sum_all {
    ($($items: tt)+) => {
        strip_plus!($(+ $items)+)
    }
}

fn main() {
    assert_eq!(sum_all!(1 2 3 4 5), 15);
}

(детская площадка)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...