Rust 如何定义引用参数的trait函数

Rust 如何定义引用参数的trait函数,rust,Rust,我在尝试不同的解决方法时遇到了这个问题 我试图定义一个trait,它通过引用接受一个参数,并返回Self,如下所示: struct X {} trait CopyFrom { fn copy_from(&x: X) -> Self; } 我得到的错误是: error[E0642]: patterns aren't allowed in functions without bodies --> src/main.rs:5:18 | 5 | fn cop

我在尝试不同的解决方法时遇到了这个问题

我试图定义一个trait,它通过引用接受一个参数,并返回
Self
,如下所示:

struct X {}

trait CopyFrom {
    fn copy_from(&x: X) -> Self;
}
我得到的错误是:

error[E0642]: patterns aren't allowed in functions without bodies
 --> src/main.rs:5:18
  |
5 |     fn copy_from(&x: X) -> Self;
  |                  ^^ pattern not allowed in function without body
如果我按值取
x
,它编译得很好(但这会消耗参数,我不希望这样)

Rust参考文件中有这样一句话:

参数的模式类型仅限于以下类型之一: 以下:

  • 标识符
  • mut标识符
  • _
  • &标识符
  • &&标识符
从2018版开始,函数或方法参数模式 不再是可选的。此外,所有无可辩驳的模式都是允许的 只要有一具尸体。如果没有正文,上面列出的限制 仍然有效


我找不到任何其他东西可以解释为什么我不能定义一个引用参数的trait函数。

您在这里使用了错误的语法-
&x:x
是一个取消引用
x
类型参数的函数;换句话说,

fn f(&x: X) {
    // ...
}
相当于

fn f(x: X) {
    let &x = x;
}
这反过来意味着

fn f(x: X) {
    let x = *x;
}
相反,您希望使参数本身成为引用:

fn f(x: &X) { // take argument by reference
    // ...
}