title: How do I implement abs function to custom type in Rust?
body: <p>I am currently writing a numerical code using Rust. So I created a type for it myself.
  This trait is a data way to allow rust_ndarray to perform calculations on both f64 and f32. To make it multi-threaded, we added Sync and Send to the bounds of the trait.
  How can I implement a function in my own type that is found in other integer types?</p>
  <pre class="lang-rust prettyprint-override"><code>use ndarray_linalg::lapack::Lapack;
  use ndarray_linalg::types::Scalar;
  use ndarray_linalg::rand_distr::Float;
  use std::marker::{Sync, Send};
  
  pub trait Type: Lapack + Scalar + Float + Sync + Send {}
  
  impl Type for f32 {}
  impl Type for f64 {}
  </code></pre>
  <p>I would like to write my own function to find the absolute value for this Type.
  How can I implement it?
  I did the implementation as shown below and got the following error.</p>
  <pre class="lang-rust prettyprint-override"><code>impl Type {
      pub fn abs(&amp;self) -&gt; Self {
          if self.0 &gt; 0. {self.0}
          else {-1. * self.0}
      }
  }
  </code></pre>
  <p>I received the following error.
  Given the errors I've received, it seems like there is a problem with the trait boundary I'm using in Type. I also tried including ParticalOrd and ParticalEq in the trate boundary and received the same error.</p>
  <pre><code>note: for a trait to be &quot;object safe&quot; it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit &lt;https://doc.rust-lang.org/reference/items/traits.html#object-safety&gt;
      |
     ::: src/traits.rs:7:11
      |
  7   | pub trait Type: Lapack + Scalar + Float + Sync + Send {}
      |           ------- this trait cannot be made into an object...
     --&gt; /Users/~~/.cargo/registry/src/github.com-1ecc6299db9ec823/rand_distr-0.2.2/src/utils.rs:24:33
      |
  24  | pub trait Float: Copy + Sized + cmp::PartialOrd
      |                                 ^^^^^^^^^^^^^^^ ...because it uses `Self` as a type parameter
  25  |     + ops::Neg&lt;Output = Self&gt;
  26  |     + ops::Add&lt;Output = Self&gt;
      |       ^^^^^^^^^^^^^^^^^^^^^^^
      |       |        |
      |       |        ...because it uses `Self` as a type parameter
      |       ...because it uses `Self` as a type parameter
  27  |     + ops::Sub&lt;Output = Self&gt;
      |       ^^^^^^^^^^^^^^^^^^^^^^^
      |       |        |
      |       |        ...because it uses `Self` as a type parameter
      |       ...because it uses `Self` as a type parameter
  28  |     + ops::Mul&lt;Output = Self&gt;
      |       ^^^^^^^^^^^^^^^^^^^^^^^
      |       |        |
      |       |        ...because it uses `Self` as a type parameter
      |       ...because it uses `Self` as a type parameter
  29  |     + ops::Div&lt;Output = Self&gt;
      |       ^^^^^^^^^^^^^^^^^^^^^^^
      |       |        |
      |       |        ...because it uses `Self` as a type parameter
      |       ...because it uses `Self` as a type parameter
  30  |     + ops::AddAssign + ops::SubAssign + ops::MulAssign + ops::DivAssign
      |       ^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^ ...because it uses `Self` as a type parameter
      |       |                |                |
      |       |                |                ...because it uses `Self` as a type parameter
      |       |                ...because it uses `Self` as a type parameter
      |       ...because it uses `Self` as a type parameter
      |
     ::: /Users/~~/.cargo/registry/src/github.com-1ecc6299db9ec823/cauchy-0.2.2/src/lib.rs:44:7
      |
  44  |     + Sum
      |       ^^^ ...because it uses `Self` as a type parameter
  45  |     + Product
      |       ^^^^^^^ ...because it uses `Self` as a type parameter
      |
     ::: /Users/~~/.cargo/registry/src/github.com-1ecc6299db9ec823/num-traits-0.2.14/src/lib.rs:67:41
      |
  67  | pub trait Num: PartialEq + Zero + One + NumOps {
      |                ^^^^^^^^^                ^^^^^^ ...because it uses `Self` as a type parameter
      |                |
      |                ...because it uses `Self` as a type parameter
  ...
  149 | pub trait NumAssign: Num + NumAssignOps {}
      |                            ^^^^^^^^^^^^ ...because it uses `Self` as a type parameter
      |
     ::: /Users/~~/.cargo/registry/src/github.com-1ecc6299db9ec823/num-traits-0.2.14/src/identities.rs:12:25
      |
  12  | pub trait Zero: Sized + Add&lt;Self, Output = Self&gt; {
      |                         ^^^^^^^^^^^^^^^^^^^^^^^^
      |                         |         |
      |                         |         ...because it uses `Self` as a type parameter
      |                         ...because it uses `Self` as a type parameter
  ...
  90  | pub trait One: Sized + Mul&lt;Self, Output = Self&gt; {
      |                        ^^^^^^^^^^^^^^^^^^^^^^^^
      |                        |         |
      |                        |         ...because it uses `Self` as a type parameter
      |                        ...because it uses `Self` as a type parameter
  
  error[E0038]: the trait `Type` cannot be made into an object
     --&gt; src/traits.rs:13:6
  
  
  
  13  | impl Type {
      |      ^^^^^^^ `Type` cannot be made into an object
      |
  note: for a trait to be &quot;object safe&quot; it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit &lt;https://doc.rust-lang.org/reference/items/traits.html#object-safety&gt;
      |
     ::: src/traits.rs:7:11
      |
  7   | pub trait Type: Lapack + Scalar + Float + Sync + Send {}
      |           ------- this trait cannot be made into an object...
     --&gt; /Users/~~/.cargo/registry/src/github.com-1ecc6299db9ec823/rand_distr-0.2.2/src/utils.rs:24:33
      |
  24  | pub trait Float: Copy + Sized + cmp::PartialOrd
      |                                 ^^^^^^^^^^^^^^^ ...because it uses `Self` as a type parameter
  25  |     + ops::Neg&lt;Output = Self&gt;
  26  |     + ops::Add&lt;Output = Self&gt;
      |       ^^^^^^^^^^^^^^^^^^^^^^^
      |       |        |
      |       |        ...because it uses `Self` as a type parameter
      |       ...because it uses `Self` as a type parameter
  27  |     + ops::Sub&lt;Output = Self&gt;
      |       ^^^^^^^^^^^^^^^^^^^^^^^
      |       |        |
      |       |        ...because it uses `Self` as a type parameter
      |       ...because it uses `Self` as a type parameter
  28  |     + ops::Mul&lt;Output = Self&gt;
      |       ^^^^^^^^^^^^^^^^^^^^^^^
      |       |        |
      |       |        ...because it uses `Self` as a type parameter
      |       ...because it uses `Self` as a type parameter
  29  |     + ops::Div&lt;Output = Self&gt;
      |       ^^^^^^^^^^^^^^^^^^^^^^^
      |       |        |
      |       |        ...because it uses `Self` as a type parameter
      |       ...because it uses `Self` as a type parameter
  30  |     + ops::AddAssign + ops::SubAssign + ops::MulAssign + ops::DivAssign
      |       ^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^ ...because it uses `Self` as a type parameter
      |       |                |                |
      |       |                |                ...because it uses `Self` as a type parameter
      |       |                ...because it uses `Self` as a type parameter
      |       ...because it uses `Self` as a type parameter
      |
     ::: /Users/~~/.cargo/registry/src/github.com-1ecc6299db9ec823/cauchy-0.2.2/src/lib.rs:44:7
      |
  44  |     + Sum
      |       ^^^ ...because it uses `Self` as a type parameter
  45  |     + Product
      |       ^^^^^^^ ...because it uses `Self` as a type parameter
      |
     ::: /Users/~~/.cargo/registry/src/github.com-1ecc6299db9ec823/num-traits-0.2.14/src/lib.rs:67:41
      |
  67  | pub trait Num: PartialEq + Zero + One + NumOps {
      |                ^^^^^^^^^                ^^^^^^ ...because it uses `Self` as a type parameter
      |                |
      |                ...because it uses `Self` as a type parameter
  ...
  149 | pub trait NumAssign: Num + NumAssignOps {}
      |                            ^^^^^^^^^^^^ ...because it uses `Self` as a type parameter
      |
     ::: /Users/~~/.cargo/registry/src/github.com-1ecc6299db9ec823/num-traits-0.2.14/src/identities.rs:12:25
      |
  12  | pub trait Zero: Sized + Add&lt;Self, Output = Self&gt; {
      |                         ^^^^^^^^^^^^^^^^^^^^^^^^
      |                         |         |
      |                         |         ...because it uses `Self` as a type parameter
      |                         ...because it uses `Self` as a type parameter
  ...
  90  | pub trait One: Sized + Mul&lt;Self, Output = Self&gt; {
      |                        ^^^^^^^^^^^^^^^^^^^^^^^^
      |                        |         |
      |                        |         ...because it uses `Self` as a type parameter
      |                        ...because it uses `Self` as a type parameter
  </code></pre>