Skip to content

Commit 28ca7ba

Browse files
committed
struct lifetime
1 parent dcb1142 commit 28ca7ba

File tree

8 files changed

+203
-676
lines changed

8 files changed

+203
-676
lines changed

Cargo.lock

Lines changed: 57 additions & 674 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

chapter2/mandelbrot/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ edition = "2021"
66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
77

88
[dependencies]
9-
num = "0.4.3"
10-
image = "0.25.2"
9+
num = "0.4"
10+
image = "0.23"

chapter3/rust-type/src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ fn print(n: &[f64]) {
128128
}
129129
}
130130

131+
use regex::Regex;
132+
131133
#[test]
132134
fn test_string() {
133135
let _speech = "Ouch! said the well.\n";

chapter7/errors/src/main.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,7 @@ mod error_test {
5353
assert!(true)
5454
}
5555
}
56+
57+
fn main() {
58+
// Add your main function code here
59+
}

chapter9/implimentation/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "implimentation"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]

chapter9/implimentation/src/lib.rs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/// First in First out data structure
2+
#[derive(Default, Debug)]
3+
pub struct Queue<T> {
4+
older: Vec<T>,
5+
younger: Vec<T>,
6+
}
7+
8+
impl<T> Queue<T> {
9+
/// 所有権の取得 (selfを消費する)
10+
pub fn split(self) -> (Vec<T>, Vec<T>) {
11+
(self.older, self.younger)
12+
}
13+
/// 参照の取得 (selfを消費しない)
14+
pub fn len(&self) -> usize {
15+
self.older.len() + self.younger.len()
16+
}
17+
pub fn is_empty(&self) -> bool {
18+
self.older.is_empty() && self.younger.is_empty()
19+
}
20+
/// &mut Queue<T> に対するメソッド
21+
pub fn push(&mut self, v: T) {
22+
self.younger.push(v);
23+
}
24+
///
25+
/// # Returns
26+
/// - `Some(T)` if the queue is not empty
27+
/// - `None` if the queue is empty
28+
///
29+
/// ```
30+
/// use implimentation::Queue;
31+
/// let mut q = Queue::<u32>::default();
32+
/// assert!(q.len() == 0);
33+
/// assert!(q.is_empty());
34+
/// q.push(42);
35+
/// assert!(q.len() == 1);
36+
/// assert!(!q.is_empty());
37+
///
38+
/// assert_eq!(q.pop(), Some(42));
39+
/// assert!(q.len() == 0);
40+
/// assert!(q.is_empty());
41+
/// ```
42+
pub fn pop(&mut self) -> Option<T> {
43+
if self.older.is_empty() {
44+
if self.younger.is_empty() {
45+
return None;
46+
} else {
47+
std::mem::swap(&mut self.older, &mut self.younger);
48+
self.older.reverse();
49+
}
50+
}
51+
self.older.pop()
52+
}
53+
}
54+
55+
pub fn add(left: u64, right: u64) -> u64 {
56+
left + right
57+
}
58+
59+
#[cfg(test)]
60+
mod tests {
61+
use super::*;
62+
63+
#[test]
64+
fn it_works() {
65+
let result = add(2, 2);
66+
assert_eq!(result, 4);
67+
}
68+
69+
#[test]
70+
fn it_works_queue() {
71+
let mut q = Queue::<u32>::default();
72+
assert!(q.len() == 0);
73+
assert!(q.is_empty());
74+
q.push(1);
75+
q.push(2);
76+
assert_eq!(q.pop(), Some(1));
77+
assert_eq!(q.pop(), Some(2));
78+
assert_eq!(q.pop(), None);
79+
}
80+
}

chapter9/lifetime-param/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "lifetime-param"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]

chapter9/lifetime-param/src/lib.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/// LifeTime as struct member
2+
///
3+
/// 任意の生存期間'eltに対して、生存期間があ;eltの参照を保持するExtrema<'elt>を作ることができる
4+
///
5+
/// # Examples
6+
struct Extrema<'elt> {
7+
greatest: &'elt i32,
8+
least: &'elt i32,
9+
}
10+
11+
fn find_extrema<'s>(slice: &'s [i32]) -> Extrema {
12+
let mut greatest = &slice[0];
13+
let mut least = &slice[0];
14+
15+
for i in 1..slice.len() {
16+
if slice[i] < *least {
17+
least = &slice[i];
18+
}
19+
if slice[i] > *greatest {
20+
greatest = &slice[i]
21+
}
22+
}
23+
Extrema { greatest, least }
24+
}
25+
26+
pub fn add(left: u64, right: u64) -> u64 {
27+
left + right
28+
}
29+
30+
#[cfg(test)]
31+
mod tests {
32+
use super::*;
33+
34+
#[test]
35+
fn it_works() {
36+
let result = add(2, 2);
37+
assert_eq!(result, 4);
38+
}
39+
#[test]
40+
fn it_work_find_extreama() {
41+
let a = [0, -3, 0, 15, 48];
42+
let e = find_extrema(&a);
43+
assert_eq!(*e.least, -3);
44+
assert_eq!(*e.greatest, 48);
45+
}
46+
}

0 commit comments

Comments
 (0)