Search code examples
rustsyntaxrust-obsolete

What is "0is" notation in Rust?


As seen in this repository:

https://github.com/ReactiveX/RxRust/blob/master/src/lib.rs#L110

let gen = move |:| {
    let it = range(0is, 20is);
    //             ~~~  ~~~~
    let q   = Box::new(Decoupler::new(dtx.clone()));
    let mut map1 = Box::new(Map::new(|i : isize| {i * 10}));
    let mut map2 = Box::new(Map::new(|i : isize| {i + 2}));
    let mut iter = Box::new(IterPublisher::new(it));


    map2.subscribe(q);
    map1.subscribe(map2);
    iter.subscribe(map1);
};

(squiggly emphasis mine)

I'm trying to figure out what is after a numeral is. The Book says about literal suffixes only briefly:

Note that all number literals except the byte literal allow a type suffix, such as 57u8, and _ as a visual separator, such as 1_000.

https://doc.rust-lang.org/book/ch03-02-data-types.html#integer-types

And the compiler (1.53) only understands a set of specific suffixes, so I could not even get the original crate built on my machine:

invalid suffix `is`
help: the suffix must be one of the numeric types (`u32`, `isize`, `f32`, etc.)

Is it some sort of archaic syntax, or is it me missing something?


Solution

  • In the old, pre 1.0, times, integer suffixes were a little different.

    Thanks to the Wayback Machine, we can take a peek to the past:

    There are 10 valid values for an integer suffix: \

    • The is and us suffixes give the literal type isize or usize, respectively.
    • Each of the signed and unsigned machine types u8, i8, u16, i16, u32, i32, u64 and i64 give the literal the corresponding machine type.

    But in Rust 1.0 the first bullet went away and now you write 20isize instead of 20is.