Syntax 为什么在传递特性作为函数参数时需要'impl'?

Syntax 为什么在传递特性作为函数参数时需要'impl'?,syntax,rust,traits,Syntax,Rust,Traits,在以下将特征作为参数传递的示例中,需要在函数签名中发送impl 我知道traits是更泛型的类型,而不是具体的类型,但是由于Rust编译器不允许跨结构和traits共享名称,为什么需要在函数签名中提供impl来表示类型 pub fn notify(项目:impl摘要){ println!(“突发新闻”{},item.summary()); } 文档提到上面的签名只是下面签名的语法糖。使用trait Summary而不是impl Summary是否有意义,因为impl也可以用于定义结构上的方法

在以下将特征作为参数传递的示例中,需要在函数签名中发送
impl

我知道traits是更泛型的类型,而不是具体的类型,但是由于Rust编译器不允许跨结构和traits共享名称,为什么需要在函数签名中提供
impl
来表示类型

pub fn notify(项目:impl摘要){
println!(“突发新闻”{},item.summary());
}
文档提到上面的签名只是下面签名的语法糖。使用
trait Summary
而不是
impl Summary
是否有意义,因为
impl
也可以用于定义结构上的方法

发布fn通知(项目:T){
println!(“突发新闻”{},item.summary());
}

与Go或Java等语言相反,Rust允许静态和动态调度,并且需要一些语法让程序员在两者之间进行选择

由于动态分派必须适用于可能没有
大小的对象
,因此您需要一个引用来使用它。也就是说,您可以使用
&dyn Trait
Box
(注意:出于历史原因,
dyn
关键字不是必需的,但现代锈菌使用它)。在C++中,动态调度也需要引用或指针。 静态分派不是Go或Java拥有的东西。在C++中,它与模板和鸭类型一起工作。在Rust中,它使用泛型和特征,其原始语法是:

一些函数(foo:T){…} 后来,在该语言中添加了以下语法:

fn some_function(foo: impl Trait) { … }
这相当于上述内容

该语法最初是为在返回类型中使用而发明的,在返回类型中没有通用等价物:

fn some_function() -> impl Trait { … }
这意味着
some_函数
可以返回实现
Trait
的任何单一类型,但这种类型必须在编译时已知。例如,这比返回
有一些性能优势。在C++中,最接近的等价物将返回<代码>自动<代码>或<代码> DECKECTL(AUTO)

为了对称,添加了参数位置的语法

您可能想知道,为什么不简单地将泛型隐式化并具有:

fn some_function(foo: Trait) { … }
但这会有点令人困惑<代码>特征本身没有大小,因此不能用作参数,除非它们是泛型的。这将使特征在未分级类型中脱颖而出。例如,如果
(foo:Trait)
有效,您可能想知道为什么
(foo:str)
无效,但这是什么意思?使泛型隐式还有其他问题,例如,特征中的泛型使特征非对象安全


稍后,Rust可能会扩展这些存在类型,并允许在模块级别进行扩展:

类型Foo=impl-Bar;
(目前允许夜间使用,由
type\u alias\u impl\u trait
功能保护)



最后,您会问为什么语法是
impl-Foo
,而不是
trait-Foo
。这可以理解为“实现Foo的类型”。《圣经》没有太多地讨论替代语法,特别是语法是否应该是参数位置的
any Foo
,以及返回位置的
some Foo
。据我所知,trait Foo的语法从未被考虑过。

与Go或Java等语言相反,Rust允许静态和动态调度,程序员需要一些语法来选择两者

由于动态分派必须适用于可能没有
大小的对象
,因此您需要一个引用来使用它。也就是说,您可以使用
&dyn Trait
Box
(注意:出于历史原因,
dyn
关键字不是必需的,但现代锈菌使用它)。在C++中,动态调度也需要引用或指针。 静态分派不是Go或Java拥有的东西。在C++中,它与模板和鸭类型一起工作。在Rust中,它使用泛型和特征,其原始语法是:

一些函数(foo:T){…} 后来,在该语言中添加了以下语法:

fn some_function(foo: impl Trait) { … }
这相当于上述内容

该语法最初是为在返回类型中使用而发明的,在返回类型中没有通用等价物:

fn some_function() -> impl Trait { … }
这意味着
some_函数
可以返回实现
Trait
的任何单一类型,但这种类型必须在编译时已知。例如,这比返回
有一些性能优势。在C++中,最接近的等价物将返回<代码>自动<代码>或<代码> DECKECTL(AUTO)

为了对称,添加了参数位置的语法

您可能想知道,为什么不简单地将泛型隐式化并具有:

fn some_function(foo: Trait) { … }
但这会有点令人困惑<代码>特征本身没有大小,因此不能用作参数,除非它们是泛型的。这将使特征在未分级类型中脱颖而出。例如,如果
(foo:Trait)
有效,您可能想知道为什么
(foo:str)
无效,但这是什么意思?使泛型隐式还有其他问题,例如,特征中的泛型使特征非对象安全


稍后,Rust可能会扩展这些存在类型,并允许在模块级别进行扩展:

类型Foo=impl-Bar;
(目前允许夜间使用,由
type\u alias\u impl\u trait
功能保护)


最后,您会问为什么语法是
impl-Foo
,而不是
trait-Foo
。这可以理解为“实现Foo的类型”。《圣经》没有太多地讨论替代语法,尤其是语法是否应该