我尝试使用nannou crate来随机生成符号,但是在编写随机生成符号并将其存储到以下结构体中的函数时遇到了麻烦
struct Sigil<T,U>{
major:Drawing<'static,T>,
minor:Vec<Drawing<'static,U>>
}
我试着做以下事情
fn sigil_make<T,U>(app: &App)->Sigil<T,U>{
let draw=app.draw();
let mut sigil:Sigil<T,U>;
match random::<u8>()%2 {
0=>sigil.major=draw.ellipse(),
1=>sigil.major=draw.polygon(),
_=>println!("uh oh")
}
return sigil;
}
但是这不起作用,因为major期望的是T类型,而我试图将其设置为来自nannou的形状。
怎样做才是合适的呢?
1条答案
按热度按时间jq6vz3qz1#
这里一下子有好几个问题。我将列出它们沿着可能的解决方案。
T
类型,但您的函数本身已经知道该类型。T
参数即可。(调用者指定U
是什么可能是有意义的,因为您的函数没有。Box<dyn _>
)或“either”类型,例如每个可能的返回类型都有一个变体的枚举。app.draw()
返回的Draw
的生存期,但当函数返回时,Draw
将被销毁。&Draw
而不是一个&App
,这将为您提供一个更长寿命的Draw
。match
的_
臂也需要作为相同类型的东西进行评估。Option
。由于不可能有另一个值,我们可以使用内置的unreachable!
宏来恐慌。1
臂更改为_
。Sigil
;minor
字段未初始化,因此无法返回它。minor
。Sigil
指定Drawing
值的生存期为'static
,但不保证为真。Sigil
添加生存期。下面是一个如何解决这些问题的示例: