下面的示例显示了两个函数foo()
,bar()
它们尝试连接两个字符串.如果左侧+
参数为a,则代码将无法编译&String
.
这是一个例子,foo()
其中无法编译错误消息[E0369].该函数bar()
表明我可以通过克隆LHS参数来摆脱困境.我的直觉表明这种克隆应该是多余的.
为什么我要clone()
参加LHS论证?这是Rust +
-operator 当前实现状态的反映,还是有一种有意的深层思考?
// rustc 1.7.0-nightly (110df043b 2015-12-13) fn foo(a: &String, i: i32) -> String { a + &i.to_string() // .. '+' cannot be applied to type & .. String [E0369] } fn bar(a: &String, i: i32) -> String { a.clone() + &i.to_string() // Ok } #[test] fn my_test() { assert!(foo(&"s".to_string(), 42) == "s42"); // fn foo(..) failed to compile assert!(bar(&"s".to_string(), 42) == "s42"); // Ok }
DK... 5
如果您查看特征的文档Add
(或当前的每晚文档Add
),您将看到:
impl<'a> Add<&'a str> for String
这是for 的唯一实现.这个签名意味着需要的左手侧由值,而不是由参考,因此需要调用.Add
String
clone()
为了澄清,Add<&str>
for String
只是一个包装器String::push_str
,它附加到a的末尾String
,重新使用现有的分配.通过不可变指针执行此操作是不可能的,并且通过可变指针执行此操作将非常奇怪并且与合理的期望相反.因此,它要求LHS按值传递.
根据您的要求,+
操作员被定义为任何形式的String
疣,因此,无论其他表格是否被定义是......嗯,据我所知,这是一个悬而未决的问题.
如果您查看特征的文档Add
(或当前的每晚文档Add
),您将看到:
impl<'a> Add<&'a str> for String
这是for 的唯一实现.这个签名意味着需要的左手侧由值,而不是由参考,因此需要调用.Add
String
clone()
为了澄清,Add<&str>
for String
只是一个包装器String::push_str
,它附加到a的末尾String
,重新使用现有的分配.通过不可变指针执行此操作是不可能的,并且通过可变指针执行此操作将非常奇怪并且与合理的期望相反.因此,它要求LHS按值传递.
根据您的要求,+
操作员被定义为任何形式的String
疣,因此,无论其他表格是否被定义是......嗯,据我所知,这是一个悬而未决的问题.