Skip to content

Commit 0c33197

Browse files
Rollup merge of rust-lang#35993 - matthew-piziak:bitwise-and-redux, r=GuillaumeGomez
improve `BitAnd` trait documentation This pull request is based on the discussion in PR rust-lang#35927. Add a module-level note that `&&` and `||` are short-circuiting operators and not overloadable. Add a simple `Scalar` example that lifts the `&` operator to a trivial struct tuple. Make `BooleanVector` a struct tuple. Derive `PartialEq` for `BooleanVector` instead of implementing it. Adds a `fn main` wrapper so that the example can integrate with Rust Playground.
2 parents 67949a3 + e2d9974 commit 0c33197

File tree

1 file changed

+41
-21
lines changed

1 file changed

+41
-21
lines changed

src/libcore/ops.rs

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
//! custom operators are required, you should look toward macros or compiler
2222
//! plugins to extend Rust's syntax.
2323
//!
24+
//! Note that the `&&` and `||` operators short-circuit, i.e. they only
25+
//! evaluate their second operand if it contributes to the result. Since this
26+
//! behavior is not enforceable by traits, `&&` and `||` are not supported as
27+
//! overloadable operators.
28+
//!
2429
//! Many of the operators take their operands by value. In non-generic
2530
//! contexts involving built-in types, this is usually not a problem.
2631
//! However, using these operators in generic code, requires some
@@ -860,41 +865,56 @@ not_impl! { bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 }
860865
///
861866
/// # Examples
862867
///
863-
/// In this example, the `BitAnd` trait is implemented for a `BooleanVector`
864-
/// struct.
868+
/// In this example, the `&` operator is lifted to a trivial `Scalar` type.
865869
///
866870
/// ```
867871
/// use std::ops::BitAnd;
868872
///
869-
/// #[derive(Debug)]
870-
/// struct BooleanVector {
871-
/// value: Vec<bool>,
872-
/// };
873+
/// #[derive(Debug, PartialEq)]
874+
/// struct Scalar(bool);
873875
///
874-
/// impl BitAnd for BooleanVector {
876+
/// impl BitAnd for Scalar {
875877
/// type Output = Self;
876878
///
879+
/// // rhs is the "right-hand side" of the expression `a & b`
877880
/// fn bitand(self, rhs: Self) -> Self {
878-
/// BooleanVector {
879-
/// value: self.value
880-
/// .iter()
881-
/// .zip(rhs.value.iter())
882-
/// .map(|(x, y)| *x && *y)
883-
/// .collect(),
884-
/// }
881+
/// Scalar(self.0 & rhs.0)
885882
/// }
886883
/// }
887884
///
888-
/// impl PartialEq for BooleanVector {
889-
/// fn eq(&self, other: &Self) -> bool {
890-
/// self.value == other.value
885+
/// fn main() {
886+
/// assert_eq!(Scalar(true) & Scalar(true), Scalar(true));
887+
/// assert_eq!(Scalar(true) & Scalar(false), Scalar(false));
888+
/// assert_eq!(Scalar(false) & Scalar(true), Scalar(false));
889+
/// assert_eq!(Scalar(false) & Scalar(false), Scalar(false));
890+
/// }
891+
/// ```
892+
///
893+
/// In this example, the `BitAnd` trait is implemented for a `BooleanVector`
894+
/// struct.
895+
///
896+
/// ```
897+
/// use std::ops::BitAnd;
898+
///
899+
/// #[derive(Debug, PartialEq)]
900+
/// struct BooleanVector(Vec<bool>);
901+
///
902+
/// impl BitAnd for BooleanVector {
903+
/// type Output = Self;
904+
///
905+
/// fn bitand(self, BooleanVector(rhs): Self) -> Self {
906+
/// let BooleanVector(lhs) = self;
907+
/// assert_eq!(lhs.len(), rhs.len());
908+
/// BooleanVector(lhs.iter().zip(rhs.iter()).map(|(x, y)| *x && *y).collect())
891909
/// }
892910
/// }
893911
///
894-
/// let bv1 = BooleanVector { value: vec![true, true, false, false] };
895-
/// let bv2 = BooleanVector { value: vec![true, false, true, false] };
896-
/// let expected = BooleanVector { value: vec![true, false, false, false] };
897-
/// assert_eq!(bv1 & bv2, expected);
912+
/// fn main() {
913+
/// let bv1 = BooleanVector(vec![true, true, false, false]);
914+
/// let bv2 = BooleanVector(vec![true, false, true, false]);
915+
/// let expected = BooleanVector(vec![true, false, false, false]);
916+
/// assert_eq!(bv1 & bv2, expected);
917+
/// }
898918
/// ```
899919
#[lang = "bitand"]
900920
#[stable(feature = "rust1", since = "1.0.0")]

0 commit comments

Comments
 (0)