У меня есть структура, которую мы можем построить с помощью шаблона построителя, потому что есть несколько полей Option
al.
Если я использую функции построителя для указания этих необязательных полей, мне не нужно указывать общие параметры.
Но если я не вызываю эти функции, мне нужно указать общие параметры.
Вот пример:
use Structs::*;
struct Struct<T, F: Fn(T)> {
func: Option<F>,
value: T,
}
enum Structs<T, F: Fn(T)> {
Struct1(T),
Struct2(T, F),
}
impl<T, F: Fn(T)> Struct<T, F> {
fn new(value: T) -> Struct<T, F> {
Struct {
func: None,
value: value,
}
}
fn build(self) -> Structs<T, F> {
if let Some(func) = self.func {
Struct2(self.value, func)
}
else {
Struct1(self.value)
}
}
fn func(mut self, func: F) -> Struct<T, F> {
self.func = Some(func);
self
}
}
fn main() {
let _strct = Struct::new(42)
.func(|n| { println!("{}", n); })
.build();
//let _strct = Struct::new(42).build(); // Does not compile.
let _strct = Struct::<_, &Fn(_)>::new(42).build();
}
Я хотел бы опустить аннотацию типа, когда необязательные поля не установлены, например:
let _strct = Struct::new(42).build();
Следует указать, что тип F
зависит от T
.
Я попытался указать параметр типа по умолчанию как таковой:
impl<T, F: Fn(T) = Box<Fn(T)>> Struct<T, F> {
но это не решает проблему.
Итак, как мне избежать необходимости указывать параметры типа в вызове Struct::new()
?
Если этого невозможно избежать, есть ли какие-либо альтернативы шаблону построителя, которые позволили бы мне опустить аннотацию типа?
T
илиF
, то сколько места компилятор Rust должен выделить для храненияStruct
? - person Shepmaster   schedule 19.05.2016F
никогда не используется, он может просто записать это поле как размер 0. Проблема, конечно, в том, что такого рода вывод всей программы действительно сложен. - person LinearZoetrope   schedule 19.05.2016