当前位置: 首页 > 知识库问答 >
问题:

两者之间有什么区别

赏弘
2023-03-14

我正在浏览微软的Rust教程,它是关于

实现copy_and_return函数,以便返回对插入向量中的值的引用

这里给出了解决方案,但它与我的不同之处在于它使用了

// standard solution
fn copy_and_return<'a>(vector: &'a mut Vec<String>, value: &'a str) -> &'a String {
    vector.push(String::from(value));
    vector.get(vector.len() - 1).unwrap()
}
// my solution
fn copy_and_return<'a>(vector: &'a mut Vec<String>, value: &'a str) -> &'a str {
    vector.push(String::from(value));
    return value; // simply return value
}

fn main() {
    let name1 = "Joe";
    let name2 = "Chris";
    let name3 = "Anne";

    let mut names = Vec::new();

    assert_eq!("Joe", copy_and_return(&mut names, &name1));
    assert_eq!("Chris", copy_and_return(&mut names, &name2));
    assert_eq!("Anne", copy_and_return(&mut names, &name3));

    assert_eq!(
        names,
        vec!["Joe".to_string(), "Chris".to_string(), "Anne".to_string()]
    )
}

除了返回类型之外,我的和标准解决方案之间的另一个区别是,我只是简单地返回了参数,而标准解决方案使用复杂方式vector.get(vector.len() - 1).unwrap())。

我想知道我的解决方案是否有任何问题,本教程采取了另一种方式?

虽然@Masklin为我的问题提供了一个很好的答案,但它有点特定于我给出的示例,但没有直接解决标题<code>之间的区别

基本上,String 包装并管理动态分配的 str 作为后备存储。由于无法调整 str 的大小,因此 String 将动态分配/解除分配内存。一个

锈书的第4.3章也有帮助


共有1个答案

夔宏深
2023-03-14
匿名用户

我想知道我的解决方案是否有任何问题,本教程采取了另一种方式?

我不认为这本身有什么问题,你的名字甚至可能更符合函数名,这取决于它是如何解释的:你应该复制并返回原始的,还是复制并返回副本?你的是第一选择,他们的是第二选择。

生命周期使它变得无关紧要,但这确实对程序行为产生了影响:在“官方”解决方案中,结果是对插入到< code>Vec中的值的引用,这意味着只要向量存在(至少假设向量没有被修改),它就将是“活的”。

如果替换值,您可以看到差异

虽然请注意,官员也可以返回

fn copy_and_return<'a>(vector: &'a mut Vec<String>, value: &'_ str) -> &'a str {
    vector.push(String::from(value));
    vector.get(vector.len() - 1).unwrap()
}

官方解决方案很难通过例如

vector.get(vector.len() - 1)

是一种复杂的书写方式

vector.last()

但我不能说,他们可能只是不想用高级API之类的东西来压倒读者。

 类似资料:
  • 问题内容: 我无法理解以下文本…这是否意味着空的构造函数?为什么拥有两个不同的版本很重要? https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html 在Java虚拟机级别,每个构造函数(第2.12节)都作为具有特殊名称的实例初始化方法出现。该名称由编译器提供。因为该名称不是有效的标识符,所以不能直接用Java编程语言编写的程序中使

  • 问题内容: 我试图破译以下功能: 我从http://blog.danlew.net/2014/09/15/grokking-rxjava- part-1/ 获得了一个很好的rxjava简介,但是它只是顺便提到了Observer,说您将在大多数情况下使用Subscriber从Observable发射到消费项目的时间。 有人可以向我解释 什么是观察者? 观察者与订户有何不同? 上面的代码段是做什么的?

  • createOrReplace eTempView和as函数别名火花sql查询使用的区别是什么? 我试图理解这两种方法之间的区别。

  • 本文向大家介绍createElement与cloneElement两者有什么区别?相关面试题,主要包含被问及createElement与cloneElement两者有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 1.第一个参数不一样 React.cloneElement( element, [props], [...children] ) React.createElement( type

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • > -返回类型是实体和 -返回类型为实体 过程1需要一个额外的步骤,使用optional.get()从optional中获取实体。有什么不同吗?你推荐哪一种?