当前位置:  开发笔记 > 后端 > 正文

E0369连接字符串引用时

如何解决《E0369连接字符串引用时》经验,为你挑选了1个好方法。

下面的示例显示了两个函数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 的唯一实现.这个签名意味着需要的左手侧由值,而不是由参考,因此需要调用.AddStringclone()

为了澄清,Add<&str>for String只是一个包装器String::push_str,它附加到a的末尾String,重新使用现有的分配.通过不可变指针执行此操作是不可能的,并且通过可变指针执行此操作将非常奇怪并且与合理的期望相反.因此,它要求LHS按值传递.

根据您的要求,+操作员被定义为任何形式的String疣,因此,无论其他表格是否被定义是......嗯,据我所知,这是一个悬而未决的问题.



1> DK...:

如果您查看特征的文档Add(或当前的每晚文档Add),您将看到:

impl<'a> Add<&'a str> for String

这是for 的唯一实现.这个签名意味着需要的左手侧由值,而不是由参考,因此需要调用.AddStringclone()

为了澄清,Add<&str>for String只是一个包装器String::push_str,它附加到a的末尾String,重新使用现有的分配.通过不可变指针执行此操作是不可能的,并且通过可变指针执行此操作将非常奇怪并且与合理的期望相反.因此,它要求LHS按值传递.

根据您的要求,+操作员被定义为任何形式的String疣,因此,无论其他表格是否被定义是......嗯,据我所知,这是一个悬而未决的问题.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有