Templates 为什么可以';我有一个构造函数在显式定义另一个类型参数的同时推导出一个类型参数吗?

Templates 为什么可以';我有一个构造函数在显式定义另一个类型参数的同时推导出一个类型参数吗?,templates,generics,constructor,rust,Templates,Generics,Constructor,Rust,为什么我不能让一个构造函数在明确定义另一个类型参数时推断出一个类型参数(其中a和B应该是不同的) 你可以,只是不能那样 impl<A> S<A, ()> { fn new<C: Default>(a: A) -> S<A, C> { S { a: a, b: Default::default(), } } } impl{ fn新(a:a)->S{

为什么我不能让一个构造函数在明确定义另一个类型参数时推断出一个类型参数(其中
a
B
应该是不同的)


你可以,只是不能那样

impl<A> S<A, ()> {
    fn new<C: Default>(a: A) -> S<A, C> {
        S {
            a: a,
            b: Default::default(),
        }
    }
}
impl{
fn新(a:a)->S{
{
a:a,
默认值::默认值(),
}
}
}
在这种情况下,
B
使用什么类型并不重要,因为它永远不会被使用。它只需满足规定的约束并充当占位符


我本可以使用
B
作为参数,但我重新命名了它,以明确它与正在实现的类型没有直接关系。

您可以,只是不是这样

impl<A> S<A, ()> {
    fn new<C: Default>(a: A) -> S<A, C> {
        S {
            a: a,
            b: Default::default(),
        }
    }
}
impl{
fn新(a:a)->S{
{
a:a,
默认值::默认值(),
}
}
}
在这种情况下,
B
使用什么类型并不重要,因为它永远不会被使用。它只需满足规定的约束并充当占位符


我本可以使用
B
作为参数,但我将其重命名以明确它与正在实现的类型没有直接关系。

我认为您根本不想在函数上指定类型参数。相反,您应该只允许编译器在构造结构时使用
\uuu
作为类型来推断结构的其他类型参数:

struct S<A, B: Default> {
    a: A, b: B
}

impl<A, B: Default> S<A, B> {
    fn new(a: A) -> Self {
        S {
            a: a,
            b: Default::default(),
        }
    }
}

fn main() {
    let s = S::<_, u32>::new(10);
}
结构{
a:a,b:b
}
impl S{
fn新(a:a)->自我{
{
a:a,
默认值::默认值(),
}
}
}
fn main(){
设s=s:new(10);
}

我认为您根本不想在函数上指定类型参数。相反,您应该只允许编译器在构造结构时使用
\uuu
作为类型来推断结构的其他类型参数:

struct S<A, B: Default> {
    a: A, b: B
}

impl<A, B: Default> S<A, B> {
    fn new(a: A) -> Self {
        S {
            a: a,
            b: Default::default(),
        }
    }
}

fn main() {
    let s = S::<_, u32>::new(10);
}
结构{
a:a,b:b
}
impl S{
fn新(a:a)->自我{
{
a:a,
默认值::默认值(),
}
}
}
fn main(){
设s=s:new(10);
}

您想做什么?两个示例都有3个完全独立的类型参数(
A
B
B1
/内部
B
)。为什么要在构造函数上引入新的类型参数?@Shepmaster只是因为引入另一个类型参数允许我指定要创建的内容。(返回类型可能应该是
S
而不是
Self
)您想做什么?两个示例都有3个完全独立的类型参数(
A
B
B1
/内部
B
)。为什么要在构造函数上引入新的类型参数?@Shepmaster只是因为引入另一个类型参数允许我指定要创建的内容。(可能返回类型应该是
S
而不是
Self
)我相信这个
impl
只适用于
S
,也就是说,一般不适用于任何
S
?@dhardy:那么?您没有使用
S
()
之所以存在,是因为必须将
B
type参数设置为某个值。编译器从上下文推断出
A
,然后显式地给出
B
。它与您提供的示例代码一起工作;我想它确实有用。只是不要将任何使用
B
的函数放在同一
impl
块中。在对
B
有任何类型限制的示例中,“虚拟类型”可能必须是
()
以外的其他类型。我相信
impl
只适用于
S
,也就是说,通常不适用于任何
S
?您没有使用
S
()
之所以存在,是因为必须将
B
type参数设置为某个值。编译器从上下文推断出
A
,然后显式地给出
B
。它与您提供的示例代码一起工作;我想它确实有用。只是不要将任何使用
B
的函数放在同一
impl
块中。在对
B
有任何类型限制的示例中,“虚拟类型”可能不是
()
,我想这就是我想要的。谢谢。我想这就是我想要的。谢谢