2016-11-01 2 views
2

Я понимаю, что это незаконно в Руст:Возможно наличие структуры/кортежа признаков в Rust?

trait A { } 
struct S { a: A, b: A } 

Причина заключается в том, что все члены, кроме последнего, должны иметь размеры, и черта не размера.

Означает ли это, что невозможно иметь структуру/кортеж черт? Как мне вернуть пару значений из функции, и я знаю только, что они реализуют определенный признак?

ответ

7

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

Если вы не являетесь владельцем объектов, вы можете использовать ссылку.

struct S1<'a> { 
    a: &'a A, 
    b: &'a A, 
} 

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

struct S1<'a, 'b> { 
    a: &'a A, 
    b: &'b A, 
} 

Если вы хотите иметь объекты, вы можете использовать Box.

struct S2 { 
    a: Box<A>, 
    b: Box<A>, 
} 

Кроме того, если вы знаете конкретный тип во время компиляции, и вы просто хотите, чтобы написать общий код, вы можете написать Generic STRUCT тоже

struct S3<A1: A, A2: A> { 
    a: A1, 
    b: A2, 
} 

В S3, каждый A1 или A2 представляет собой конкретный тип, который реализует признак A при его создании в коде.

+0

Спасибо. Я думаю, что S3 - это то, что я ищу, но как это объявление делает размер структуры таким, чтобы компилятор не жаловался? – rityzmon

+0

@ rityzmon, это потому, что 'A1' и' A2' будут действительными типами при создании экземпляров, которые имеют размер, хотя черта 'A' ​​не является. Вам нужно будет указать тип 'A1' и' A2', когда вы используете общую структуру вашего кода. Вот как (и когда) компилятор знает размер ваших типов, потому что вы буквально говорите компилятору, что именно такие типы. – WiSaGaN

+0

Спасибо. И как бы я использовал ту же технику, если я хочу вернуть кортеж признаков из функции? Одна конкретная проблема, которую я пытаюсь выяснить, - это «trait T {fn func (& self, x: & Self) -> (Self, Self); } '. Единственная функция в признаке принимает другой объект того же типа и возвращает еще два объекта одного типа. – rityzmon

Смежные вопросы