我对借贷和所有权感到困惑.在Rust 文档中有关引用和借用的内容
let mut x = 5;
{
let y = &mut x;
*y += 1;
}
println!("{}", x);
Run Code Online (Sandbox Code Playgroud)
他们说
println!可以借x.
我很困惑.如果println!借入x,为什么它通过x不&x?
我尝试在下面运行此代码
fn main() {
let mut x = 5;
{
let y = &mut x;
*y += 1;
}
println!("{}", &x);
}
Run Code Online (Sandbox Code Playgroud)
除了传递&x给代码之外,这段代码与上面的代码相同println!.它将'6'打印到控制台,这是正确的,与第一个代码的结果相同.
当实现原始固定大小的矢量类型(float2例如)时,我想支持Add和Sub特征.后来,我想支持Mul和*Assign.
查看文档和其他示例,我想出了这个:
use std::ops::{Add, Sub};
#[derive(Copy, Clone)]
struct float2(f64, f64);
impl Add for float2 {
type Output = float2;
fn add(self, _rhs: float2) -> float2 {
float2(self.0 + _rhs.0, self.1 + _rhs.1)
}
}
impl Sub for float2 {
type Output = float2;
fn sub(self, _rhs: float2) -> float2 {
float2(self.0 - _rhs.0, self.1 - _rhs.1)
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于基本的例子,但是我在实践中发现我会经常与作为参数传入,以及局部引用最终float2在栈上的.
混合这些我需要:
例:
impl<'a, 'b> Add<&'b float2> for …Run Code Online (Sandbox Code Playgroud) 编译以下使用运算符重载的Rust代码
use std::ops::{Add};
#[derive(Show)]
struct Point {
x: int,
y: int
}
impl Add for Point {
type Output = Point;
fn add(self, other: Point) -> Point {
Point {x: self.x + other.x, y: self.y + other.y}
}
}
fn main() {
let p: Point = Point {x: 1, y: 0};
let pp = p + p;
}
Run Code Online (Sandbox Code Playgroud)
由于p的所有权导致编译器错误:
<anon>:21:18: 21:19 error: use of moved value: `p`
<anon>:21 let pp = p + p;
^
<anon>:21:14: 21:15 note: `p` moved …Run Code Online (Sandbox Code Playgroud) 我想创建一个不可变的,引用数据类型,并添加如下:
use std::ops::Add;
struct Point {
x: i64,
y: i64,
}
impl<'a> Add for &'a Point {
type Output = Point;
fn add(self, other: &Point) -> Point {
Point {
x: self.x + &other.x,
y: self.y + &other.y,
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何实现添加特征以引用结构?建议Add在引用类型上实现.
我可以做到这一点,在哪里a和b是Point:
let c = &a + &b;
let d = &c + &b;
Run Code Online (Sandbox Code Playgroud)
但不是这个:
let d = &a + &b + &b;
Run Code Online (Sandbox Code Playgroud)
我不介意这些&迹象,但不能连锁添加对我来说并不好看.我想实现乘法(z = a + …