TrDefault, found struct TrNotDefault)
теперь ещё хочу спросить, почему компилятор не видит FooBuilder::default()...
да, хочется, чтобы билдер имел именно такой дефолт.
и ещё непонятно, как в таком случае должно выглядеть объявление Foo::builder(). так, очевидно, не прокатит: pub fn builder() -> FooBuilder<T> { FooBuilder::default() } а ожидать в методе builder параметр tr, чтобы затем передать в FooBuilder::new(tr) как-то тупо. builder-паттерн как-то сразу смазывается.
У тебя with_t не меняет тип T, поэтому компилятор из этого вызова вывел что T = TrNotDefault
Идея в том, что билдер по дефолту предоставляет один T, но ты, если хочешь, можешь задать другой, через with_t. Т.о., если билдер был создан через ::default(), то все последующие вызовы поменяют тип у t, а значит что-то не так.
т.е. кажется, что задать generic-builder-у default с возможностью последующего изменения типа параметра, не представляется возможным. либо так и задумывалось, либо нет...
Просто сделай так, чтобы with_t могла тип менять: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=5b0775527e59b40f72f5f12db4daea5b
добрался до компа это ж не то. тут создается новый инстанс, а мне нужно изменить имеющийся. т.е. да, так работает, но... а если в билдере стопицот параметров, всё надо скопировать в новый инстанс?
А как вы хотите тип менять иначе?) Копирование скорее всего выоптимизируется
вообще, конечно, в лучших традициях научной фантастики, хочу, чтоб всё "само" сделалось)
Обсуждают сегодня