openlang

这个元组为什么会移动字符串?

let message = String::from("hello");

let pair = (message, message.len());

// 我不明白相同变量之间的所有权转移,也就是最初的 message 和元组里的 message,如果所有 message 都相同 ,这怎么能工作呢???

从英语翻译查看原文

后续讨论 2

顺着彼此的依据读下去
  1. 固定链接

    把一个已有变量放进元组,就会把该变量的所有权交给元组。而且有些情况下,这些操作的先后顺序很重要,你的例子就是这样。你的代码无法编译,因为再次访问值之前,元组就已经拿走了它(message.len() 的调用发生在移动之后)。但如果改成这样写。

    let message = String::from("hello");
    
    let pair = (message.len(), message);

    就能编译成功,因为 message.len() 在元组取得所有权之前执行。

    也建议读一下 Rust 书中关于所有权的章节(https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html),应该能帮助理解。

    从英语翻译查看原文

同一个问题的其他角度

  1. 同样的 sink 调用,这一行是拷贝,下一行就是移动

    Nim 2 是按调用点决定拷贝还是移动的,不是按 proc。 同一个参数,同一个 proc。第一次调用会拷贝,因为后面还要用 a。第二次就移动了。调用点上没有任何东西告诉你是哪种。nim c --expandArc:main 会打印改写后的函数体,两…

    回复 2最近活动 nim
  2. 让清理块真正执行时才开始可变借用

    怎样在 Rust 中写一个 panic 安全的机制,类似 Java 的 try { ... } finally { ... },同时允许 try 和 finally 块分别可变借用同一个值? 我需要的是,无论正常离开还是因 panic 栈展开而离开…

    回复 2最近活动 rust
  3. 通过指针输入字符数组

    每次尝试从键盘往一些 char 数组里输入内容,程序最后都会崩溃。 有什么简单方便的方法,可以从键盘读取 char 数组并保存下来?

    回复 2最近活动 c