In order to understand the issue, you have to think about it in terms of what the compiler sees.
Typically, a compiler never reasons about the value of an expression, only about its type. Thus:
a
is of type Vec<i32>
4
is of an unknown integral type
Vec<i32>
implements subscripting, so a[4]
type checks
Having a compiler reasoning about values is not unknown, and there are various ways to get it.
- you can allow evaluation of some expression at compile-time (C++
constexpr
for example)
- you can encode value into types (C++ non-type template parameters, using Peano's numbers)
- you can use dependent typing which bridges the gap between types and values
Rust does not support any of these at this point in time, and while there has been interest for the former two it will certainly not be done before 1.0.
Thus, the values are checked at runtime, and the implementation of Vec
correctly bails out (here failing).
4
as just an expression, which may as well bef(x)
that may return some other value. - Colonel Thirty TwoVec<int>
is and that if you start withVec::new()
that it's size is 0 and that if you call push on it three times, its size goes to 3 and that the index in the square bracket has to be less than the vector's size.Vec
is just a library type. The compiler has no special knowledge about it. - sellibitze