< 返回我的博客

套路小迷糊 发表于 2018-01-29 13:08

节选自《Rust 沉思录》系列连载:阅读原文

对于 Rust 的固有设计来说它是一种强类型语言,禁止隐式类型转换。 我们在使用 Rust 进行开发的时候尽量不要破坏这种原有设计。然而, 当您想要处理一个不是某一个类型的值的时候就不得不使用显式的方式进行类型转换。 当您这样做的时候,您会发现这像惩罚小学生一样枯燥无趣。

如果您想要让它更灵活以及更好维护,您可以这样做:

fn print_a_number<T:  Into<i32>>(number: T) {
    println!("{}", number.into());
}
 
fn main() {
    let foo = 0u8;
    print_a_number(1);
    print_a_number(foo);
}

此处还有另外一种写法是,不过需要使用 Nightly 版本进行编译:

#![feature(universal_impl_trait)]
 
fn print_a_number(number: impl  Into<i32>) {
    println!("{}", number.into());
}
 
fn main() {
    let foo = 0u8;
    print_a_number(1);
    print_a_number(foo);
}

这并没有破坏 Rust 原本的设计,而且使得代码更好维护了。 有一种做法是通常不可取的,除非您正在使用 Rust 实现某种弱类型语言的解释器。 即对某一类型不断地实现运算符重载和其他特征使其看起来像是一种弱类型语言。 这大致和在 C 语言中使用 define 宏让其看起来像是 BASIC 语言那样一样愚蠢。 因为这和原有的设计背道而驰。我们在使用 Rust 语言进行开发的时候, 尽可能要保证不和语言原有的设计相悖。

评论区

写评论
bournn 2018-04-15 22:23

rust是"zero-cost abstractions",它在内存上有与c类似的表现。对于这个概念,它是不是影响rust是类型强弱的因素呢?

1 共 1 条评论, 1 页