Я вызываю функцию, которая принимает &[&str]
. Как удобнее писать ["aa", "bb"]
, вместо &["aa", "bb"]
, я решил добавить AsRef
:Как создать построитель, который принимает тип, который реализует AsRef для фрагмента `& str`?
struct Builder<'a> {
s: Option<&'a [&'a str]>,
}
impl<'a> Builder<'a> {
fn new() -> Builder<'a> {
Builder { s: None }
}
fn abc<S>(&mut self, s: S) -> &mut Self
where S: AsRef<[&'a str]> + 'a
{
self.s = Some(s.as_ref());
self
}
fn build(&self) -> u32 {
0
}
}
fn main() {
Builder::new().abc([]).build();
}
Но есть проблема с жизнью:
error: `s` does not live long enough
self.s = Some(s.as_ref());
^
note: reference must be valid for the lifetime 'a as defined on the block at 12:4...
{
self.s = Some(s.as_ref());
self
}
note: ...but borrowed value is only valid for the scope of parameters for function at 12:4
{
self.s = Some(s.as_ref());
self
}
Как осущ 'AsRef 'для' str'? 'impl <'a, S: AsRef <[AsRef] >> Builder
{' не работает. – LupeЯ считал, что предлагаю что-то подобное, но поскольку '' 'завернут в' Option', похоже, что строитель должен быть вызван без 'abc'. Попробуйте это, и вы увидите, что тип не может быть выведен. Вы можете сделать значение по умолчанию 'S' или начать с пустого массива или чего-то еще. Если вы всегда * должны вызывать 'abc', то он должен быть предоставлен как часть конструктора строителя, и все это проще. – Shepmaster
@ Lupe Можете ли вы пояснить, что вы хотите с примером? – malbarbo