Rust泛型

从一段代码引起的思考:

struct Val<T> {
    val: T,
}

impl<T> Val<T> {
    fn value(&self) -> &T {
        &self.val
    }
}


fn main() {
    let x = Val{ val: 3.0 };
    let y = Val{ val: "hello".to_string()};
    println!("{}, {}", x.value(), y.value());
}

在这段代码中为什么value函数要返回val的引用呢?
可不可以不返回引用。
不返回引用换句话说,就是要把val的所有权给转移出去。
那么要实现这一点要怎么做呢?
可以想到两种办法,

  1. 给这个T类型实现一下Copy trail,实现了之后,这个类型就可以直接Copy了,而不会发生所有权的转移。
  2. 转移val的所有权。
    那么接下来一一看下,要实现这些东西,代码要怎么写
    首先看第一种:
use std::env::var;

#[derive(Debug, Clone,Copy, PartialEq, Eq)]
struct A;
struct Val<T:Copy> {
    val: T,
}

impl<T:Copy> Val<T> {
    fn value(&self) -> T {
        self.val
    }
}


fn main() {
    let x = Val{ val: 3.0 };
    //let y = Val{ val: "hello".to_string()};
    let z = Val{val:A};
   // println!("{}, {}", x.value(), y.value());
    println!("{}", x.val);
    println!("{:?}", z.val);
}

然后来看第二种:

struct Val<T> {
    val: T,
}

impl<T> Val<T> {
    fn value(self) -> T {
        self.val
    }
}


fn main() {
    let x = Val{ val: 3.0 };
    let y = Val{ val: "hello".to_string()};
    println!("{}, {}", x.value(), y.value());
}

在这个代码中,val的所有权被转移了。
在 Rust 中,如果你想编写一个方法,将结构体中某个字段的所有权转移出去,你不可以使用 &mut self 作为参数,因为 &mut self 是一个可变借用,而不是所有权的转移。为了转移所有权,你需要使用 self 作为方法的接收者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值