當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust Shl用法及代碼示例


本文簡要介紹rust語言中 Trait core::ops::Shl 的用法。

用法

pub trait Shl<Rhs = Self> {
    type Output;
    fn shl(self, rhs: Rhs) -> Self::Output;
}

左移運算符 << 。請注意,由於此特征是針對具有多個右側類型的所有整數類型實現的,因此 Rust 的類型檢查器對 _ << _ 有特殊處理,將整數運算的結果類型設置為左側操作數的類型。這意味著雖然 a << ba.shl(b) 從評估的角度來看是相同的,但在類型推斷方麵它們是不同的。

例子

Shl 的實現,它將整數上的 << 操作提升到圍繞 usize 的包裝器。

use std::ops::Shl;

#[derive(PartialEq, Debug)]
struct Scalar(usize);

impl Shl<Scalar> for Scalar {
    type Output = Self;

    fn shl(self, Self(rhs): Self) -> Self::Output {
        let Self(lhs) = self;
        Self(lhs << rhs)
    }
}

assert_eq!(Scalar(4) << Scalar(2), Scalar(16));

Shl 的實現,將向量向左旋轉給定的量。

use std::ops::Shl;

#[derive(PartialEq, Debug)]
struct SpinVector<T: Clone> {
    vec: Vec<T>,
}

impl<T: Clone> Shl<usize> for SpinVector<T> {
    type Output = Self;

    fn shl(self, rhs: usize) -> Self::Output {
        // Rotate the vector by `rhs` places.
        let (a, b) = self.vec.split_at(rhs);
        let mut spun_vector = vec![];
        spun_vector.extend_from_slice(b);
        spun_vector.extend_from_slice(a);
        Self { vec: spun_vector }
    }
}

assert_eq!(SpinVector { vec: vec![0, 1, 2, 3, 4] } << 2,
           SpinVector { vec: vec![2, 3, 4, 0, 1] });

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Trait core::ops::Shl。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。