![](/img/trans.png)
[英]How can I specify that a trait function takes an argument implementing the trait?
[英]How can I define a trait function that takes an argument by reference
我在尝试不同的方法来解决这个问题时遇到了这个问题。
我正在尝试定义一个通过引用获取参数并返回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 参考有这样的说法:
参数的模式类型仅限于以下之一:
- 标识符
- 多标识符
- _
- & 标识符
- && 标识符
从 2018 版开始,function 或方法参数模式不再可选。 此外,只要有实体,就允许所有无可辩驳的模式。 如果没有主体,上面列出的限制仍然有效。
我找不到其他任何东西可以解释为什么我不能定义一个通过引用接受参数的特征 function。
您在这里使用了错误的语法 - &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
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.