【发布时间】:2019-08-20 23:35:51
【问题描述】:
在以下将 trait 作为参数传递的示例中,需要在函数签名中发送 impl 吗?
我知道 trait 是更通用的类型而不是具体的类型,但是由于 Rust 编译器不允许跨结构和 trait 共享名称,为什么需要在函数签名中提供 impl 来表示类型?
pub fn notify(item: impl Summary) {
println!("Breaking news! {}", item.summarize());
}
文档提到上面的签名只是下面签名的语法糖。使用trait Summary 代替impl Summary 是否有意义,因为impl 也可以用于定义结构上的方法?
pub fn notify<T: Summary>(item: T) {
println!("Breaking news! {}", item.summarize());
}
是否有任何我遗漏的隐藏概念?
【问题讨论】:
-
我知道 trait 是更通用的类型,而不是具体的类型 — trait 的名称既 又是一个类型和一个 trait。见What does “dyn” mean in a type?
-
看来What does
implmean when used as the argument type or return type of a function? 的答案可能会回答您的问题。如果没有,请edit您的问题来解释差异。否则,我们可以将此问题标记为已回答。 -
你只是在问为什么是
impl Foo而不是trait Foo?语法impl Foo可以理解为“实现Foo”,因此语法非常合理。 -
是的@mcarton。这都是关于语法的。在 go 和 java 等其他语言中,接口也是一种类型,您将参数的类型命名为
interface。我希望 rustc 有类似的东西有f: trait Foo而不是f: impl Foo或只是f: Foo因为编译器无论如何都不允许重复类型。