pub trait Applicable {
// Required methods
fn apply<F, R>(self, f: F) -> Self
where F: FnOnce(&mut Self) -> R;
fn apply_with_param<F, P, R>(self, f: F, p: P) -> Self
where F: FnOnce(&mut Self, P) -> R;
fn apply_with_params<F, P, R>(self, f: F, p: Vec<P>) -> Self
where F: Fn(&mut Self, P) -> R;
}
Expand description
Allows you to apply any function given as a parameter to the object.
As you are able to connect operations to the object with chains, it allow you to describe the sequence of operations neatly. This is useful, for example, if you want to change the internal state with other method after the object is created.
§Examples
use apply_method::*;
#[derive(Debug, PartialEq)]
struct Dog {
name: String,
size: String,
}
impl Dog {
fn new() -> Self {
Self {
name: "Pochi".to_string(),
size: "Middle".to_string(),
}
}
}
let mut exact_dog = Dog::new();
exact_dog.size = "Big".to_string();
let dog = Dog::new().apply(|it| it.size = "Big".to_string());
assert_eq!(dog, exact_dog);
Required Methods§
Sourcefn apply<F, R>(self, f: F) -> Selfwhere
F: FnOnce(&mut Self) -> R,
fn apply<F, R>(self, f: F) -> Selfwhere
F: FnOnce(&mut Self) -> R,
Apply the function given as a parameter to self.
§Examples
use apply_method::*;
use std::path::PathBuf;
let mut exact_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
exact_path.push("src/lib.rs");
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).apply(|it| it.push("src/lib.rs"));
assert_eq!(path, exact_path);
use apply_method::*;
use std::path::PathBuf;
let mut exact_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
exact_path.push("src/lib.rs");
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.apply(|it| it.push("src"))
.apply(|it| it.push("lib.rs"));
assert_eq!(path, exact_path);
Sourcefn apply_with_param<F, P, R>(self, f: F, p: P) -> Selfwhere
F: FnOnce(&mut Self, P) -> R,
fn apply_with_param<F, P, R>(self, f: F, p: P) -> Selfwhere
F: FnOnce(&mut Self, P) -> R,
Apply the function with one parameter given as a parameter to self.
§Example
use apply_method::*;
use std::path::PathBuf;
let mut exact_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
exact_path.push("src/lib.rs");
let path =
PathBuf::from(env!("CARGO_MANIFEST_DIR")).apply_with_param(PathBuf::push, "src/lib.rs");
assert_eq!(path, exact_path);
Sourcefn apply_with_params<F, P, R>(self, f: F, p: Vec<P>) -> Selfwhere
F: Fn(&mut Self, P) -> R,
fn apply_with_params<F, P, R>(self, f: F, p: Vec<P>) -> Selfwhere
F: Fn(&mut Self, P) -> R,
Apply apply_with_param repeatedly to multiple parameters.
§Example
use apply_method::*;
use std::path::PathBuf;
let mut exact_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
exact_path.push("src");
exact_path.push("lib.rs");
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.apply_with_params(PathBuf::push, vec!["src", "lib.rs"]);
assert_eq!(path, exact_path);
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.