rust - 当方法需要值的所有权时,按值传递还是按引用传递更传统?

标签 rust reference pass-by-reference pass-by-value

当我通过引用结构的 new() 传递对象时方法,并且结构将拥有对象,是否更传统:

  • 通过引用传递对象,然后执行 to_owned()new()
  • 在调用之前克隆对象 new() ,并按值传递,移动它

  • 我可以从清晰度和关注点分离的角度考虑每种方法的优缺点。

    #[derive(Clone)]
    struct MyState;
    
    struct MyStruct {
        state: MyState,
    }
    
    impl MyStruct {
        pub fn new_by_ref(state: &MyState) -> Self {
            MyStruct {
                state: state.to_owned(),
            }
        }
    
        pub fn new_by_val(state: MyState) -> Self {
            MyStruct { state }
        }
    }
    
    fn main() {
        let state1 = MyState;
        let struct1 = MyStruct::new_by_ref(&state1);
    
        let state2 = MyState;
        let struct2 = MyStruct::new_by_val(state2.clone());
    }
    

    最佳答案

    按值传递。

    这样,如果调用者不再需要该值,程序可以避免不必要地双重分配该值。

    在许多情况下,我建议接受任何可以制作的东西 into拥有的类型。这很容易用 String 证明:

    struct MyStruct {
        state: String,
    }
    
    impl MyStruct {
        fn new(state: impl Into<String>) -> Self {
            let state = state.into();
            MyStruct { state }
        }
    }
    
    fn main() {
        let struct1 = MyStruct::new("foo");
        let struct2 = MyStruct::new(String::from("bar"));
    }
    

    也可以看看:
  • How to accept str, String and &String in a single rust function
  • 关于rust - 当方法需要值的所有权时,按值传递还是按引用传递更传统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61898884/

    相关文章:

    java - 如何在java中复制数组而不是引用?

    c# - 如何从对象内部的工作线程检测对象的无效化

    arrays - 如何初始化大多数值相同但某些值不同的静态数组?

    rust - 为什么我在 for 循环中的元组上出现 "value must be known"错误?

    arrays - Perl 中的 {} 和 ->{} 有什么区别?

    c++ - std::function 作为 & 发送的(非)const 输入参数

    Swift 等效于 C++ 指针/引用约定?

    rust - Rust 中的左值上下文到底是什么?

    rust - 对于在Rust中没有有意义的值的 map ,什么是内存有效类型?

    c++ - 通过引用和指针传递参数 C++