Rust 这种理解正确吗:特质和功能重载都实现了特殊多态性,但方向不同

Rust 这种理解正确吗:特质和功能重载都实现了特殊多态性,但方向不同,rust,polymorphism,typeclass,adhoc-polymorphism,Rust,Polymorphism,Typeclass,Adhoc Polymorphism,我正在学习一些多态性 rust addressestrait的wiki页面是一个,而says函数重载的页面是一个特殊多态性的例子 根据我目前的理解水平,如果提供不同类型的参数将调用不同的实现,那么函数是即席多态的。但是trait和函数重载看起来很不一样:trait在类型参数上添加约束,任何实现trait的类型都是可以接受的,而函数重载在具体类型上,任何未重载的类型都是不可接受的 我可以说,trait和函数重载实现了相反方向的特殊多态性吗?因为trait是专门化的,而overloading是泛化的

我正在学习一些多态性

rust addresses
trait
的wiki页面是一个,而says
函数重载的页面是一个特殊多态性的例子

根据我目前的理解水平,如果提供不同类型的参数将调用不同的实现,那么函数是即席多态的。但是
trait
函数重载
看起来很不一样:
trait
在类型参数上添加约束,任何实现
trait
的类型都是可以接受的,而函数重载在具体类型上,任何未重载的类型都是不可接受的

我可以说,
trait
函数重载
实现了相反方向的特殊多态性吗?因为
trait
是专门化的,而
overloading
是泛化的


PS:在C++中,模板特化还可以提供基于传入的类型参数的不同实现,这也是Ad Hoc多态性的一个例子吗?

< P>实现一个特性包括提供一个行为的实现,它是特定于类型的,与其他实现(“ad hoc”)分离,并且可以在调用站点使用与其他实现相同的拼写来调用(“多态”)。它与函数重载的方向相同

在C++中,可以提供重载来实现ad hoc多态性:

void foo(const X&) { ... }
void foo(const Y&) { ... }
// can call foo(z) where z is an X or a Y
你也可以对锈病的特征做同样的处理:

trait Foo { fn foo(); }
impl Foo for X { ... }
impl Foo for Y { ... }
// can call z.foo() where z is an X or a Y
我认为您所指的“另一个方向”是能够通过类型支持的行为来约束泛型。在Rust中,这看起来像:

fn bar<T: Foo>(t: T) { ... }
// bar can use t.foo()
fn条(t:t){…}
//bar可以使用t.foo()
C++有一个类比:

template<typename T> concept Foo = requires(T t) { foo(t); };
void bar(Foo auto& t) { ... }
// bar can use foo(t)
// (this uses really new C++, it's written differently in older C++)
模板概念Foo=requires(T){Foo(T);};
空栏(Foo auto&t){…}
//酒吧可以用foo(t)
//(这使用了真正的新C++,它在旧C++中的编写方式不同)
受约束的泛型函数不是特殊多态性,因为它们有一个应用于所有参数类型的实现,这些参数类型实现了对它们的任何要求


总之,特征为泛型函数提供了特定的多态性和约束,并且一些语言如C++使用不同的设备来实现相同的目的。C++中的Ad hoc多态性通常是通过函数重载来实现的。模板专门化也可以实现这一点。

实现一个trait涉及提供一个行为的实现,该行为是特定于类型的,与其他实现(“即席”)不同,并且可以在调用站点以与其他实现相同的拼写调用(“多态”)。它与函数重载的方向相同

在C++中,可以提供重载来实现ad hoc多态性:

void foo(const X&) { ... }
void foo(const Y&) { ... }
// can call foo(z) where z is an X or a Y
你也可以对锈病的特征做同样的处理:

trait Foo { fn foo(); }
impl Foo for X { ... }
impl Foo for Y { ... }
// can call z.foo() where z is an X or a Y
我认为您所指的“另一个方向”是能够通过类型支持的行为来约束泛型。在Rust中,这看起来像:

fn bar<T: Foo>(t: T) { ... }
// bar can use t.foo()
fn条(t:t){…}
//bar可以使用t.foo()
C++有一个类比:

template<typename T> concept Foo = requires(T t) { foo(t); };
void bar(Foo auto& t) { ... }
// bar can use foo(t)
// (this uses really new C++, it's written differently in older C++)
模板概念Foo=requires(T){Foo(T);};
空栏(Foo auto&t){…}
//酒吧可以用foo(t)
//(这使用了真正的新C++,它在旧C++中的编写方式不同)
受约束的泛型函数不是特殊多态性,因为它们有一个应用于所有参数类型的实现,这些参数类型实现了对它们的任何要求


总之,特征为泛型函数提供了特定的多态性和约束,并且一些语言如C++使用不同的设备来实现相同的目的。C++中的Ad hoc多态性通常是通过函数重载来实现的。模板专业化也可以实现。

谢谢!我混合了特殊多态性和类型约束部分,这个答案澄清了很多!非常感谢。我混合了特殊多态性和类型约束部分,这个答案澄清了很多!