Могут ли макросы ржавчины генерировать геттеры, поддерживающие копирование? - PullRequest
2 голосов
/ 13 июля 2020

derive-getters - хороший ящик , который создаст для вас геттеры. Однако он всегда генерирует геттеры, возвращающие ссылку, даже для типов копирования. Например, для этой структуры:

#[derive(Getters)]
pub struct MyCheesyStruct {
    x: i64,
    y: i64,
}

Она сгенерирует:

impl MyCheesyStruct {
    pub fn x(&self) -> &i64 {
        &self.x
    }

    pub fn y(&self) -> &i64 {
        &self.y
    }
}

Это делает вещи более громоздкими для пользователей, чем они должны быть, потому что i64 реализует Copy. Итак, я начал задаваться вопросом, можно ли сделать лучше? Но макросы работают на уровне токенов, поэтому они ничего не знают о типах / характеристиках. Есть ли способ получить эту функциональность, кроме ручного аннотирования членов с помощью директивы, указывающей, что они должны быть возвращены без заимствования? Это то, чем метапрограммирование на уровне типов вещей в C ++ превосходит.

1 Ответ

0 голосов
/ 13 июля 2020

Итак, я начал задаваться вопросом, можно ли сделать лучше?

В качестве частичного ответа я могу сказать, что это выполнимо для примитивных типов из коробки. Для других типов вам может потребоваться дополнительная аннотация к полю, например:

#[derive(Copy)]
pub struct Point {
  x: i64,
  y: i64,
}

#[derive(Getters)]
pub struct MyCheesyStruct {
    #[noref] // generates non-borrow getter
    point: Point,
}

Или вы можете создать версию процедурного макроса, которая генерирует не-заемные геттеры для всех полей.

...