官术网_书友最值得收藏!

Traits

Traits are a way to specify that a type must implement some methods and/or some types. They are similar to interfaces in Java. We can implement a trait on a type and we'll be able to use the methods of this trait on this type as long as this trait is imported. This is how we can add methods to types defined in other crates or even the standard library.

Let's write a trait representing a bit set:

trait BitSet {
    fn clear(&mut self, index: usize);
    fn is_set(&self, index: usize) -> bool;
    fn set(&mut self, index: usize);
}

Here, we don't write the body of the methods, as they will be defined when we implement this trait for a type.

Now, let's implement this trait for the u64 type:

impl BitSet for u64 {
    fn clear(&mut self, index: usize) {
        *self &= !(1 << index);
    }

    fn is_set(&self, index: usize) -> bool {
        (*self >> index) & 1 == 1
    }

    fn set(&mut self, index: usize) {
        *self |= 1 << index;
    }
}

As you can see, the bitwise not operator is ! in Rust, as opposed to ~ in other languages. With this code, we can call these methods on u64:

let mut num = 0;
num.set(15);
println!("{}", num.is_set(15));
num.clear(15);

Remember the #[derive(Debug)] attribute? This actually implements the Debug trait on the following type. We could also manually implement the Debug trait on our type, using the same impl syntax, if the default implement does not suit our use case.

主站蜘蛛池模板: 容城县| 万全县| 独山县| 获嘉县| 安宁市| 广东省| 勃利县| 宁夏| 鄯善县| 东乌| 和政县| 彭州市| 普兰县| 东方市| 来宾市| 岑溪市| 涿鹿县| 抚远县| 麟游县| 原阳县| 寻甸| 确山县| 松阳县| 周至县| 东城区| 北票市| 通辽市| 余姚市| 定南县| 平原县| 万州区| 三都| 东乡族自治县| 珠海市| 阳山县| 十堰市| 广元市| 沅江市| 綦江县| 卢氏县| 浑源县|