Rust - черта привязана в зависимости от особенности? - PullRequest
3 голосов
/ 23 апреля 2020

Я недавно начал использовать ржавчину и работаю над библиотекой. Следующее работает, но похоже на дублирование кода

#[cfg(feature = "serde_support")]
use serde::Serialize;

#[cfg(not(feature = "serde_support"))]
pub struct Teststruct<T>
{

    graph: T
}

#[cfg(feature = "serde_support")]
#[derive(Serialize)]
pub struct Teststruct<T>
where T: Serialize
{
    graph: T
}

Обратите внимание, что, хотя ограничение черты where T: Serialize в данном примере не является строго обязательным, является необходимым в задаче I в настоящее время сталкиваюсь.

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

#[cfg(feature = "serde_support")]
use serde::Serialize;

#[cfg_attr(feature = "serde_support", derive(Serialize))]
pub struct Teststruct<T: Node>
where T: Serialize,
      Graph<T>: Serialize + DeserializeOwned
{

    graph: Graph<T>
}

Теперь, однако, я могу компилировать только с функцией "serde_support" - без этой функции я, очевидно, получаю ошибку: Serialize не найден в этой области .

Я пытался найти что-то вроде cfg_attr для границы черты, но безрезультатно.

Есть ли элегантный способ избежать дублирования кода?

1 Ответ

2 голосов
/ 23 апреля 2020

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

Производное может быть решено с помощью cfg_attr.

#[cfg(feature = "serde_support")]
use serde::Serialize;

#[cfg(feature = "serde_support")]
pub trait MySerialize : Serialize {}

#[cfg(not(feature = "serde_support"))]
pub trait MySerialize {}

#[cfg_attr(feature = "serde_support", derive(Serialize))]
pub struct Teststruct<T>
    where T: MySerialize
{
    graph: T
}
...