Есть ли способ вообще определить универсальный тип?

Если я хочу реализовать структуру с определенным универсальным типом, который требует множества признаков, как показано ниже. Затем мне придется копировать это каждый раз, когда я реализую признак для этой структуры (где ему нужен тот же тип), есть ли сокращенный способ сделать это? Я представляю что-то вроде generic T = Add + ... + PartialEq

impl<T> FOO<T>
where
    FE: Add
        + Copy
        + ...
        + Debug
        + PartialEq,

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

Как создавать пользовательские общие типы в Python (50/100 дней Python)
Как создавать пользовательские общие типы в Python (50/100 дней Python)
Помимо встроенных типов, модуль типизации в Python предоставляет возможность определения общих типов, что позволяет вам определять типы, которые могут...
3
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

trait Combined: Copy + Clone + Debug + Display /* add how many of these you want */ {}

impl<T> Combined for T where T: Copy + Clone + Debug + Display {}

struct Foo<T: Combined>(T);

impl<T: Combined> Foo<T> {
    //
}

Однако обратите внимание, что идиоматично оставлять границы типажа при объявлении структур (если только вам не нужно называть связанные типы этих свойств) и устанавливать границы только на блоки impl. Тем не менее, этот метод позволяет значительно упростить именование сложных границ.

Для этого примечания: вы имеете в виду, что было бы более идиоматично написать просто struct Foo<T>(T)?

yshavit 14.08.2024 23:13

@yshavit Да. И поместите Combined привязанным к T в общем блоке impl.

Aleksander Krauze 14.08.2024 23:17

Круто, спасибо! Я этого не знал (опасности самообучения, легко пропустить идиомы)

yshavit 14.08.2024 23:17

@yshavit Ха, тогда я убил двух зайцев одним выстрелом. :) Примеры можно найти в стандартной библиотеке. Например, Cell<T> не имеет привязки Copy к T, только при определении блока impl get. Таким образом, вы можете создать Cell с помощью T: !Copy, но затем не сможете вызвать get на нем. Этот шаблон является общим для стандартной библиотеки.

Aleksander Krauze 14.08.2024 23:20

@AleksanderKrauze Да, это имеет смысл. Я просто никогда не замечал этого раньше. :-D

yshavit 14.08.2024 23:24

Другие вопросы по теме