Если я хочу реализовать структуру с определенным универсальным типом, который требует множества признаков, как показано ниже. Затем мне придется копировать это каждый раз, когда я реализую признак для этой структуры (где ему нужен тот же тип), есть ли сокращенный способ сделать это? Я представляю что-то вроде generic T = Add + ... + PartialEq
impl<T> FOO<T>
where
FE: Add
+ Copy
+ ...
+ Debug
+ PartialEq,
Я пытался найти это в Интернете, но безуспешно, однако я новичок в ржавчине, так что это может быть очевидно, извините, если это так.

Вы можете создать новую черту, которая будет иметь все необходимые вам черты в качестве суперособенностей, а затем использовать общую реализацию. Например:
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. Тем не менее, этот метод позволяет значительно упростить именование сложных границ.
@yshavit Да. И поместите Combined привязанным к T в общем блоке impl.
Круто, спасибо! Я этого не знал (опасности самообучения, легко пропустить идиомы)
@yshavit Ха, тогда я убил двух зайцев одним выстрелом. :) Примеры можно найти в стандартной библиотеке. Например, Cell<T> не имеет привязки Copy к T, только при определении блока impl get. Таким образом, вы можете создать Cell с помощью T: !Copy, но затем не сможете вызвать get на нем. Этот шаблон является общим для стандартной библиотеки.
@AleksanderKrauze Да, это имеет смысл. Я просто никогда не замечал этого раньше. :-D
Для этого примечания: вы имеете в виду, что было бы более идиоматично написать просто
struct Foo<T>(T)?