Rust impl-trait参数和泛型函数参数之间有什么区别?

Rust impl-trait参数和泛型函数参数之间有什么区别?,rust,Rust,。这和带有特征约束的泛型函数之间有什么区别吗 trait Foo {} fn func1(_: impl Foo) {} fn func2<T: Foo>(_: T) {} trait Foo{} fn func1(uu:impl Foo){} fn func2(u:T){} 两者都产生相同的组件,至少使用以下简单测试用例: trait Foo {} struct Bar; impl Foo for Bar {} fn func1(_: impl Foo) {} fn

。这和带有特征约束的泛型函数之间有什么区别吗

trait Foo {}

fn func1(_: impl Foo) {}

fn func2<T: Foo>(_: T) {}
trait Foo{}
fn func1(uu:impl Foo){}
fn func2(u:T){}

两者都产生相同的组件,至少使用以下简单测试用例:

trait Foo {}

struct Bar;

impl Foo for Bar {}

fn func1(_: impl Foo) {}

fn func2<T: Foo>(_: T) {}

fn main() {
    let x = Bar;

    let y = func1(x); // or func2(x);
}
trait Foo{}
结构杆;
为条{}的impl Foo
fn func1(uu:impl Foo){}
fn func2(u:T){}
fn main(){
设x=Bar;
设y=func1(x);//或func2(x);
}

impl Trait
s作为函数参数被分解为匿名泛型参数。请参见以下内容:

展开
impl Trait
以允许在参数中使用,其行为类似于匿名泛型参数

RFC中还有一个例子:

// These two are equivalent
fn map<U>(self, f: impl FnOnce(T) -> U) -> Option<U>
fn map<U, F>(self, f: F) -> Option<U> where F: FnOnce(T) -> U

本节解释了为现有功能添加其他语法的原因。简言之,这是为了在函数返回位置具有类似于
impl
traits的语法,从而提高可学习性,并改善人体工程学。

Hm,谢谢。我没有读RFC;我只看到了github问题的链接,它来自于《铁锈中的本周》。@Boiethios RFC,甚至是合并的RFC,并不总是与当前版本的铁锈保持一致——它们可能还没有实现、实施了更改或被取代——所以这仍然是一个公平的问题。但是,在这种情况下,RFC是准确的。(当RFC合并后进行了更改时,您希望在RFC的跟踪问题中找到这一点。)
fn foo<T: Trait>(t: T)
fn bar(t: impl Trait)

foo::<u32>(0) // this is allowed
bar::<u32>(0) // this is not