在取随机数的模数时输入推断失败

Qua*_*rew 1 rust

rustc 1.0.0-夜间(be9bd7c93 2015-04-05)(建于2015-04-05)

extern crate rand;

fn test(a: isize) {
    println!("{}", a);
}

fn main() {
    test(rand::random() % 20)
}
Run Code Online (Sandbox Code Playgroud)

此代码在Rust beta之前编译,但现在它没有:

src/main.rs:8:10: 8:22 error: unable to infer enough type information about `_`; type annotations required [E0282]
src/main.rs:8     test(rand::random() % 20)
                       ^~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我必须编写这段代码来编译:

extern crate rand;

fn test(a: isize) {
    println!("{}", a);
}

fn main() {
    test(rand::random::<isize>() % 20)
}
Run Code Online (Sandbox Code Playgroud)

如何让编译器推断出类型?

Lev*_*ans 5

编译器在这种情况下无法推断类型,有太多未知数.

让我们调用R输出类型rand::random()I类型20.

强加的条件test(rand::random() % 20)仅为:

R: Rand + Rem<I, Ouput=isize>
I: integral variable (i8, u8, i16, u16, i32, u32, i64, u64, isize or usize)
Run Code Online (Sandbox Code Playgroud)

没有什么可以保证只有一对(T, I)会满足这些要求(实际上很容易创建一个T满足它们的新类型),因此编译器无法自行选择.

因此,使用rand::random::<isize>()是正确的方法.