vlang error: unwrapped Result cannot be used in an infix expression

38 Views Asked by At

I have written simple code to overload + operator in v, and unit test for validate if code is working.

// vector.v
module vector

pub struct Vector {
    values []int
}

pub fn (v Vector) at(index int) int {
    return v.values[index]
}

fn (v1 Vector) + (v2 Vector) !Vector {
    if v1.values.len != v2.values.len {
        return error('Vectors must be of the same length')
    }
    mut result := []int{len: v1.values.len}
    for i in 0 .. v1.values.len {
        result[i] = v1.values[i] + v2.values[i]
    }
    return Vector{
        values: result
    }
}
// vector_test.v
module vector

fn test_matrix_add() {
    v1 := Vector{
        values: [1, 2, 3]
    }
    v2 := Vector{
        values: [4, 5, 6]
    }

    result := Vector{
        values: [5, 7, 9]
    }

    assert v1 + v2 == result
}

when I am running v test ., I am getting this error.

src/vector/vector_test.v:15:9: error: unwrapped Result cannot be used in an infix expression
   13 |     }
   14 | 
   15 |     assert v1 + v2 == result
      |            ~~~~~~~
   16 | }

Now after looking at documentation, I was trying to unwrap v1 + v2 result since it can also return an error, like this assert (v1 + v2 or {}) == result but it was giving me error like this error: cannot use or {} block on non-option variable.

Finally, I tried some workaround like below,

result := v1 + v2

expected := Vector{
    values: [5, 7, 9]
}

assert result == expected

This time I didn't got any error from v but got builder error in c.

error: cannot convert 'struct _result_src__vector__Vector' to 'struct src__vector__Vector'

builder error: 
==================
C error. This should never happen.

This is a compiler bug, please report it using `v bug file.v`.
0

There are 0 best solutions below