在Rust中,修改借用指针会改变原始值吗?

时间:2012-11-29 05:37:16

标签: pointers vector rust

这是Rust 0.4

我相信它确实如此,但对于我的特定用例似乎并非如此。

我有一个拥有指向vector的指针向量的指针。

我将其构建如下。

let mut table = ~[];
for [0, ..10].each |i| {
    let mut row = ~[];
    for [0, ..128].each |j| {
        row.push(A_CERTAIN_ENUM);
    }
    table.push(row);
}

然后,我将这个二维向量传递给另一个函数以进一步初始化。

该功能看起来像这样。

fn setT (table: &mut ~[~[SomeEnumType]]) {
    // Demonstration purposes...
    for [0, ..10].each |i| {
        for [0, ..128].each |j| {
            table[*i][*j] = A_DIFFERENT_ENUM;
        }
    }
}

我使用以下代码调用该函数。

setT(&table);

然而,经过检查,table的内容根本没有变化! 内部的所有内容仍然是A_CERTAIN_ENUM,而不是A_DIFFERENT_ENUM

有谁知道如何让另一个函数修改你传递给它的参数?

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您使用的是哪个版本的Rust?类型检查器没有抱怨使用

setT(&mut table);

我也有点难过。当然,指针应该按预期工作!

答案 1 :(得分:0)

这是类似代码的工作版本(rustc 0.5,commit 19f5f91):

enum Direction {
    North,
    East,
    South,
    West
}

fn main() {
    let mut table = ~[];
    for [0, ..10].each |i| {
        let mut row = ~[];
        for [0, ..128].each |j| {
            row.push(North);
        }
        table.push(copy row);
    }
    io::print(fmt!("before: %d\n", table[0][0] as int));
    setT(&mut table);
    io::print(fmt!("after: %d\n", table[0][0] as int));
}

fn setT(table: &mut ~[~[Direction]]) {
    for [0, ..10].each |i| {
        for [0, ..128].each |j| {
            table[*i][*j] = East;
        }
    }
}

输出:

before: 0
after: 1