#Vectors, nested functions, lambdas, warnings and errors

6 messages · Page 1 of 1 (latest)

opaque robin
#

Hi! I have a Hackerrank solution in TypeScript and I'd like to port into Rust code as a Rust beginner.
I tried to fix the problems, but I get a new error every time. I'm a bit confused.
Please help me reviewing the code, which is unfinished. Thanks.

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b6f4801f6056e9746f66b251aebdeb6a

/*
 * Complete the 'dynamicArray' function below.
 *
 * The function is expected to return an INTEGER_ARRAY.
 * The function accepts following parameters:
 *  1. INTEGER n
 *  2. 2D_INTEGER_ARRAY queries
 */

fn dynamicArray(n: i32, queries: &[Vec<i32>]) -> Vec<i32> {
    let mut arr: Vec<Vec<i32>> = vec![Vec::new(); n as usize];
    let mut lastAnswer: i32 = 0;
    let mut answers: Vec<i32> = Vec::new();

    fn get_index(x: i32, lastAnswer: i32, n: i32) -> usize {
        (x as usize ^ lastAnswer as usize) % n as usize
    }
    
    fn query_one(_x: i32, y: i32) {
        let _i = |mut arr: Vec<Vec<i32>>, x, lastAnswer, n| {
            let idx = get_index(x, lastAnswer, n);
            arr[idx].push(y);
        };     
    }
    
    fn query_two(x: i32, y: i32, answers: &mut Vec<i32>) {
        let _last_answer = |mut arr:Vec<Vec<i32>>, lastAnswer: &mut i32, n| {
            let i = get_index(x, *lastAnswer, n);
            let l = arr[i].len();
            let z = y as usize % l as usize;
            lastAnswer = &mut arr[i][z] as &mut i32;
            answers.push(*lastAnswer);
        };
    }
    
    // Trying to get rid of warnings and focus on Errors...
    
    // @todo solution...
    
    arr[0][0]= 0;
    lastAnswer = 0;
    let _ = lastAnswer;
    let _ = queries;
    let _ = query_one(0, 0);
    let _ = query_two(0, 0, &mut answers);
    
    answers
}
warning: value assigned to `lastAnswer` is never read
error[E0384]: cannot assign to immutable argument `lastAnswer`
error[E0597]: `arr` does not live long enough
sick tangle
rugged leaf
#

The lastAnswer on line 31 refers to the closure parameter declared on line 27. This is a different variable from the lastAnswer on line 12. I don't understand why you seem to be trying to make this reference point to something else, use it, then immediately discard the reference.

opaque robin
#

@sick tangle @rugged leaf

I'm trying to achieve this TypeScript solution fitted to Rust. This TS solution works well.
walkthrough video in JS https://www.youtube.com/watch?v=uQ4J5LdeEQM

/*
 * Complete the 'dynamicArray' function below.
 *
 * The function is expected to return an INTEGER_ARRAY.
 * The function accepts following parameters:
 *  1. INTEGER n
 *  2. 2D_INTEGER_ARRAY queries
 */

function dynamicArray(n: number, queries: number[][]): number[] {
    // Write your code here

    let arr: number[][] = [];
    let lastAnswer = 0;
    let answers: number[] = [];

    for (let i = 0; i < n; i++) {
        arr[i] = [];
    }

    function getIndex(x: number) {
        return (x ^ lastAnswer) % n;
    }

    function queryOne(x: number, y: number): void {
        let i = getIndex(x);
        arr[i].push(y);
    }
    
    function queryTwo(x: number, y: number): void {
        let i = getIndex(x);
        let l = arr[i].length;
        let z = (y % l);
        lastAnswer = arr[i][z];
        answers.push(lastAnswer);
    }

    for (let q of queries) {
        switch (q[0]) {
            case 1: 
                queryOne(q[1], q[2]);
                break;
            case 2:
                queryTwo(q[1], q[2]);
                break;
        }
    }

    return answers;
}

Problem description
https://www.hackerrank.com/challenges/dynamic-array/problem

vivid peak
opaque robin