eba*_*und 3 operator-overloading stringstream rust
下面的示例显示了两个函数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
}
Run Code Online (Sandbox Code Playgroud)
如果您查看特征的文档Add(或当前的每晚文档Add),您将看到:
impl<'a> Add<&'a str> for String
Run Code Online (Sandbox Code Playgroud)
这是for 的唯一实现.这个签名意味着需要的左手侧由值,而不是由参考,因此需要调用.AddStringclone()
为了澄清,Add<&str>for String只是一个包装器String::push_str,它附加到a的末尾String,重新使用现有的分配.通过不可变指针执行此操作是不可能的,并且通过可变指针执行此操作将非常奇怪并且与合理的期望相反.因此,它要求LHS按值传递.
根据您的要求,+操作员被定义为任何形式的String疣,因此,无论其他表格是否被定义是......嗯,据我所知,这是一个悬而未决的问题.