相关疑难解决方法(0)

Rust如何提供移动语义?

锈语言网站索赔移动语义的语言的特征之一.但我无法看到Rust中如何实现移动语义.

Rust box是唯一使用移动语义的地方.

let x = Box::new(5);
let y: Box<i32> = x; // x is 'moved'
Run Code Online (Sandbox Code Playgroud)

上面的Rust代码可以用C++编写

auto x = std::make_unique<int>();
auto y = std::move(x); // Note the explicit move
Run Code Online (Sandbox Code Playgroud)

据我所知(如果我错了,请纠正我),

  • Rust根本没有构造函数,更不用说移动构造函数了.
  • 不支持右值参考.
  • 无法使用rvalue参数创建函数重载.

Rust如何提供移动语义?

move-semantics rust

37
推荐指数
3
解决办法
8225
查看次数

有没有办法返回对函数中创建的变量的引用?

我想编写一个程序,分两步编写一个文件.在程序运行之前,该文件可能不存在.文件名是固定的.

问题是OpenOptions.new().write()可能会失败.在这种情况下,我想调用自定义函数trycreate().我们的想法是创建文件而不是打开它并返回一个句柄.由于文件名是固定的,trycreate()没有参数,我不能设置返回值的生命周期.

我该如何解决这个问题?

use std::io::Write;
use std::fs::OpenOptions;
use std::path::Path;

fn trycreate() -> &OpenOptions {
    let f = OpenOptions::new().write(true).open("foo.txt");
    let mut f = match f {
        Ok(file)  => file,
        Err(_)  => panic!("ERR"),
    };
    f
}

fn main() {
    {
        let f = OpenOptions::new().write(true).open(b"foo.txt");
        let mut f = match f {
            Ok(file)  => file,
            Err(_)  => trycreate("foo.txt"),
        };
        let buf = b"test1\n";
        let _ret = f.write(buf).unwrap();
    }
    println!("50%");
    {
        let f = OpenOptions::new().append(true).open("foo.txt");
        let mut f …
Run Code Online (Sandbox Code Playgroud)

reference lifetime rust

31
推荐指数
4
解决办法
1万
查看次数

什么是Rust中的移动语义?

在Rust中,有两种可能性来引用

  1. 借用,即参考,但不允许改变参考目的地.该&运营商借用值所有权.

  2. 可变地借用,即参考改变目的地.该&mut运营商性情不定地借用一个值所有权.

有关借用规则Rust文档说:

首先,任何借入必须持续不超过所有者的范围.其次,您可能拥有这两种借款中的一种或另一种,但不能同时使用这两种:

  • 一个或多个&T资源的引用(),
  • 一个可变的引用(&mut T).

我相信引用一个引用是创建一个指向值的指针并通过指针访问该值.如果存在更简单的等效实现,则编译器可以优化它.

但是,我不明白什么是移动的意思以及它是如何实现的.

对于实现Copy特征的类型,它意味着复制,例如通过从源分配结构成员,或者a memcpy().对于小结构或原始数据,此副本是有效的.

而对于

这个问题不是什么是移动语义的重复因为Rust和C++是不同的语言,移动语义在两者之间是不同的.

ownership move-semantics rust

21
推荐指数
2
解决办法
5734
查看次数

使用box关键字和Box :: new有什么区别?

是否box只是语法糖还是可以应用到地方使用的情况下Box::new是不够的?我读到某个box不稳定的地方,这是否意味着我只能将它与夜间Rust版本一起使用?

heap rust

14
推荐指数
1
解决办法
793
查看次数

我可以在Rust中按值有效地返回一个对象吗?

我想用函数初始化一个大对象.目前我有:

fn initialize(mydata: &mut Vec<Vec<MyStruct>>) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

我更愿意:

fn initialize() -> Vec<Vec<MyStruct>> { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

我听说C++经常实现返回值优化(RVO),如果你很幸运并拥有一个好的编译器.我们可以在这里禁用复制并通过传递给函数的隐藏指针返回吗?RVO是语言的一部分还是可选的优化?

optimization rust return-value-optimization

7
推荐指数
1
解决办法
2010
查看次数

实例构造效率低下?

这是一个简单的 struct

pub struct Point {
    x: uint,
    y: uint
}

impl Point {
    pub fn new() -> Point {
            Point{x: 0u, y: 0u}
    }
}

fn main() {
    let p = box Point::new();
}
Run Code Online (Sandbox Code Playgroud)

我对构造函数如何工作的理解如下.该new()函数Point在其本地堆栈中创建一个实例并返回它.来自此实例的数据被浅层复制到由其创建的堆内存中box.然后将指向堆内存的指针分配给变量p.

我的理解是否正确?两个独立的内存区域是否已初始化以创建一个实例?与C++相比,这似乎是一种初始化实例的低效方法,我们可以从构造函数直接写入实例的内存.

rust

2
推荐指数
2
解决办法
142
查看次数