summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Gong <jordan.gong@protonmail.com>2020-09-02 19:37:03 +0800
committerJordan Gong <jordan.gong@protonmail.com>2020-09-02 19:37:03 +0800
commita8a40420b4106d66bdf1c447388404896dccd494 (patch)
treee63be572e0db936a2ed1e59d577c5e5e130068df
parenteeb7ceeff94b9bac0fb629ad393e7113a04f31c1 (diff)
Generalize redundant code
-rw-r--r--generics/.gitignore18
-rw-r--r--generics/Cargo.toml9
-rw-r--r--generics/src/main.rs52
3 files changed, 79 insertions, 0 deletions
diff --git a/generics/.gitignore b/generics/.gitignore
new file mode 100644
index 0000000..e629269
--- /dev/null
+++ b/generics/.gitignore
@@ -0,0 +1,18 @@
+
+# Created by https://www.toptal.com/developers/gitignore/api/rust
+# Edit at https://www.toptal.com/developers/gitignore?templates=rust
+
+### Rust ###
+# Generated by Cargo
+# will have compiled files and executables
+/target/
+
+# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
+# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
+Cargo.lock
+
+# These are backup files generated by rustfmt
+**/*.rs.bk
+
+# End of https://www.toptal.com/developers/gitignore/api/rust
+
diff --git a/generics/Cargo.toml b/generics/Cargo.toml
new file mode 100644
index 0000000..5d46e6b
--- /dev/null
+++ b/generics/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "generics"
+version = "0.1.0"
+authors = ["Jordan Gong <jordan.gong@protonmail.com>"]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/generics/src/main.rs b/generics/src/main.rs
new file mode 100644
index 0000000..776f563
--- /dev/null
+++ b/generics/src/main.rs
@@ -0,0 +1,52 @@
+fn main() {
+ {
+ struct Point<T> {
+ x: T,
+ y: T,
+ }
+
+ impl<T> Point<T> {
+ fn x(&self) -> &T {
+ &self.x
+ }
+ }
+
+ // implement a particular concrete type
+ impl Point<f32> {
+ fn distance_from_origin(&self) -> f32 {
+ (self.x.powi(2) + self.y.powi(2)).sqrt()
+ }
+ }
+
+ let p = Point { x: 5, y: 10 };
+ println!("p.x = {}", p.x());
+
+ let p2 = Point { x: 1.0, y: 4.0 };
+ println!(
+ "distance between p2 and origin: {}",
+ p2.distance_from_origin()
+ );
+ }
+ {
+ struct Point<T, U> {
+ x: T,
+ y: U,
+ }
+
+ impl<T, U> Point<T, U> {
+ fn mixup<V, W>(self, other: Point<V, W>) -> Point<T, W> {
+ Point {
+ x: self.x,
+ y: other.y,
+ }
+ }
+ }
+
+ let p1 = Point { x: 5, y: 10.4 };
+ let p2 = Point { x: "Hello", y: 'c' };
+
+ let p3 = p1.mixup(p2);
+
+ println!("p3.x = {}, p3.y = {}", p3.x, p3.y);
+ }
+}