■ trait 키워드를 사용해 기본 구현 메소드를 갖는 트레잇을 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
pub trait Summarizable { fn summary(&self) -> String { return String::from("(Read more...)"); } } pub struct News { pub headline : String, pub location : String, pub author : String, pub content : String } impl Summarizable for News {} fn main() { let article = News { headline : String::from("Penguins win the Stanley Cup Championship!"), location : String::from("Pittsburgh, PA, USA"), author : String::from("Iceburgh"), content : String::from("The Pittsburgh Penguins once again are the best hockey team in the NHL.") }; println!("New article available! {}", article.summary()); } /* New article available! (Read more...) */ |
■ trait 키워드에서 메소드를 호출하는 기본 구현 메소드를 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
pub trait Summarizable { fn author_summary(&self) -> String; fn summary(&self) -> String { format!("(Read more from {}...)", self.author_summary()) } } pub struct Tweet { pub user_name : String, pub content : String, pub reply : bool, pub retweet : bool } impl Summarizable for Tweet { fn author_summary(&self) -> String { return format!("@{}", self.user_name); } } fn main() { let tweet : Tweet = Tweet { user_name : String::from("horse_ebooks"), content : String::from("of course, as you probably already know, people"), reply : false, retweet : false }; println!("1 new tweet : {}", tweet.summary()); } /* 1 new tweet : (Read more from @horse_ebooks...) */ |
■ trait 키워드를 사용해 트레잇을 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
pub trait Summarizable { fn summary(&self) -> String; } pub struct News { pub headline : String, pub location : String, pub author : String, pub content : String } impl Summarizable for News { fn summary(&self) -> String { return format!("{}, by {} ({})", self.headline, self.author, self.location); } } pub struct Tweet { pub user_name : String, pub content : String, pub reply : bool, pub retweet : bool } impl Summarizable for Tweet { fn summary(&self) -> String { return format!("{} : {}", self.user_name, self.content); } } fn main() { let tweet : Tweet = Tweet { user_name : String::from("horse_ebooks"), content : String::from("of course, as you probably already know, people"), reply : false, retweet : false }; println!("1 new tweet : {}", tweet.summary()); } /* 1 new tweet : horse_ebooks : of course, as you probably already know, people */ |
■ PartialOrd/Copy 트레잇에서 트레잇 바운드를 사용해 큰 값을 구하는 제네릭 함수를 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
use std::cmp; fn get_largest_value<T>(source_array : &[T]) -> T where T : cmp::PartialOrd + Copy { let mut largest_value : T = source_array[0]; for &value in source_array.iter() { if value > largest_value { largest_value = value; } } return largest_value; } fn main() { let integer_vector : Vec<i32> = vec![34, 50, 25, 100, 65]; let largest_integer : i32 = get_largest_value(&integer_vector); println!("가장 큰 정수 : {}", largest_integer); let character_vector : Vec<char> = vec!['y', 'm', 'a', 'q']; let largest_character : char = get_largest_value(&character_vector); println!("가장 큰 문자 : {}", largest_character); } /* 가장 큰 정수 : 100 가장 큰 문자 : y */ |
■ PartialOrd/Copy 트레잇을 사용해 큰 값을 구하는 제네릭 함수를 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
use std::cmp; fn get_largest_value<T : cmp::PartialOrd + Copy>(source_array : &[T]) -> T { let mut largest_value : T = source_array[0]; for &value in source_array.iter() { if value > largest_value { largest_value = value; } } return largest_value; } fn main() { let integer_vector : Vec<i32> = vec![34, 50, 25, 100, 65]; let largest_integer : i32 = get_largest_value(&integer_vector); println!("가장 큰 정수 : {}", largest_integer); let character_vector : Vec<char> = vec!['y', 'm', 'a', 'q']; let largest_character : char = get_largest_value(&character_vector); println!("가장 큰 문자 : {}", largest_character); } /* 가장 큰 정수 : 100 가장 큰 문자 : y */ |
■ String 구조체의 bytes 메소드를 사용해 바이트 값을 나열하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let string : String = String::from("ABCDE"); for value in string.bytes() { println!("{}", value); } /* 65 66 67 68 69 */ |
■ String 구조체의 chars 메소드를 사용해 문자를 나열하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let string : String = String::from("ABCDE"); for character in string.chars() { println!("{}", character); } /* A B C D E */ |
■ Iterator 트레잇의 rev 메소드를 사용해 반복자 방향을 반대로 하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
for index in (1..11).rev() { println!("{}", index); } |
■ Ord 트레잇의 cmp 메소드를 사용해 숫자를 비교하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
use std::cmp; let a : u32 = 10; let b : u32 = 20; match a.cmp(&b) { cmp::Ordering::Less => println!("A가 B보다 작다."), cmp::Ordering::Greater => println!("A가 B보다 크다."), cmp::Ordering::Equal => println!("A와 B가 같다.") } |
■ Iterator 트레잇의 map 메소드를 사용해 분할 문자열 벡터를 구하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
use std::str; let source : &str = "가가가,나나나,다다다"; let split :str::Split<'_, &str> = source.split(","); let string_vector : Vec<String> = split.map(|s| s.to_string()).collect(); println!("{:?}", string_vector); |
■ Chars 구조체의 next 메소드를 사용해 다음 문자를 구하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
use std::str; let source_string : String = String::from("ABCDEFGHIJKLMNOPQRSTUVWXYZ".to_string()); let mut source_chars: str::Chars = source_string.chars(); while let Some(source_character) = source_chars.next() { println!("{}", source_character); } |
■ String 구조체의 chars 메소드를 사용해 반복자를 구하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
use std::str; let source_string : String = String::from("ABCDEFGHIJKLMNOPQRSTUVWXYZ".to_string()); let mut source_chars: str::Chars = source_string.chars(); |
■ Iterator 트레잇의 take 메소드를 사용하는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
struct NumberIterator { maximum : usize, value : usize } impl NumberIterator { fn new(minimum : usize, maximum : usize) -> Self { return NumberIterator { maximum : maximum, value : minimum }; } } impl Iterator for NumberIterator { type Item = usize; fn next(&mut self) -> Option<Self::Item> { if self.value > self.maximum { return None; } self.value += 1; return Some(self.value - 1); } } fn main() { let iterator : NumberIterator = NumberIterator::new(10, 19); for value in iterator.take(5) { println!("{}", value); } } /* 10 11 12 13 14 */ |
■ Iterator 트레잇의 for_each 메소드를 사용하는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
struct NumberIterator { maximum : usize, value : usize } impl NumberIterator { fn new(minimum : usize, maximum : usize) -> Self { return NumberIterator { maximum : maximum, value : minimum }; } } impl Iterator for NumberIterator { type Item = usize; fn next(&mut self) -> Option<Self::Item> { if self.value > self.maximum { return None; } self.value += 1; return Some(self.value - 1); } } fn main() { let iterator : NumberIterator = NumberIterator::new(10, 14); iterator.for_each(|value| println!("{}", value)); } /* 10 11 12 13 14 */ |
■ Iterator 트레잇의 enumerate 메소드를 사용하는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
struct NumberIterator { maximum : usize, value : usize } impl NumberIterator { fn new(minimum : usize, maximum : usize) -> Self { return NumberIterator { maximum : maximum, value : minimum }; } } impl Iterator for NumberIterator { type Item = usize; fn next(&mut self) -> Option<Self::Item> { if self.value > self.maximum { return None; } self.value += 1; return Some(self.value - 1); } } fn main() { let iterator : NumberIterator = NumberIterator::new(10, 15); for (index, value) in iterator.enumerate() { println!("{} : {}", index, value); } } /* 0 : 10 1 : 11 2 : 12 3 : 13 4 : 14 5 : 15 */ |
■ Iterator 트레잇을 사용해 피보나치 수열을 구하는 반복자를 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
struct FibonacciIterator { a : usize, b : usize } impl FibonacciIterator { fn new() -> Self { return FibonacciIterator { a : 1, b : 1 }; } } impl Iterator for FibonacciIterator { type Item = usize; fn next(&mut self) -> Option<Self::Item> { let temporary_value : usize = self.a; self.a = self.b; self.b += temporary_value; return Some(self.a); } } fn main() { let fibonacci_iterator1 : FibonacciIterator = FibonacciIterator::new(); for (index, value) in fibonacci_iterator1.enumerate() { if index >= 10 { break; } print!("{},", value); } println!(""); let fibonacci_iterator2 : FibonacciIterator = FibonacciIterator::new(); fibonacci_iterator2.take(10).for_each(|value : usize| print!("{},", value)); print!("\n") } |
■ Iterator 트레잇을 구현해 소수를 구하는 반복자를 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
struct PrimeIterator { n : u8 } impl PrimeIterator { fn new() -> Self { return PrimeIterator { n : 1 }; } fn is_prime(&self) -> bool { for i in 2..self.n { if self.n % i == 0 { return false; } } return true; } } impl Iterator for PrimeIterator { type Item = u8; fn next(&mut self) -> Option<Self::Item> { loop { self.n += 1; if std::u8::MAX == self.n { return None } if self.is_prime() { return Some(self.n); } } } } fn main() { let prime_iterator : PrimeIterator = PrimeIterator::new(); for n in prime_iterator { print!("{},", n); } } |
■ AddAssign 트레잇을 사용해 구조체의 제네릭 메소드를 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
#[derive(Debug)] struct Point<T> { x : T, y : T } impl<T> Point<T> where T : std::ops::AddAssign { fn new(x : T, y : T) -> Self { return Self { x, y }; } fn add(&mut self, source : Point<T>) { self.x += source.x; self.y += source.y; } } fn main() { let mut point : Point<i32> = Point::new(10, 10); println!("{:?}", point); point.add(Point{ x : 20, y : 30 }); println!("{:?}", point); } |
■ Add/Copy 트레잇을 사용해 제네릭 함수를 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
fn get_twice_value <T: std::ops::Add<Output = T> + Copy>(value : T) -> T { return value + value; } fn main() { println!("{}", get_twice_value(3)); println!("{}", get_twice_value(3.0f64)); println!("{}", get_twice_value::<u64>(3)); // 타입을 명시하는 경우 } /* 6 6 6 */ |
■ trait 키워드에서 트레잇의 기본 메소드를 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
trait TreasureBox { fn open(&self, key_number : i32) -> bool { self.get_key_number() == key_number } fn check(&self); fn get_key_number(&self) -> i32; } struct JewelryBox { price : i32, key_number : i32 } impl TreasureBox for JewelryBox { fn check(&self) { println!("보석 상자 : {} 골드", self.price); } fn get_key_number(&self) -> i32 { return self.key_number; } } struct EmptyBox { key_number : i32 } impl TreasureBox for EmptyBox { fn check(&self) { println!("빈 상자"); } fn get_key_number(&self) -> i32 { self.key_number } } fn open_box(treasure_box : &impl TreasureBox, key_number : i32) { if !treasure_box.open(key_number) { println!("적절한 열쇠가 아니라 상자가 열리지 않는다."); return; } treasure_box.check(); } fn main() { let jewelry_box1 : JewelryBox = JewelryBox { price : 30, key_number : 1 }; let empty_box1 : EmptyBox = EmptyBox { key_number : 1 }; let jewelry_box2 : JewelryBox = JewelryBox { price : 50, key_number : 2 }; open_box(&jewelry_box1, 1); open_box(&empty_box1 , 1); open_box(&jewelry_box2, 1); } /* 보석 상자 : 30 골드 빈 상자 적절한 열쇠가 아니라 상자가 열리지 않는다. */ |
■ Add 트레잇을 사용해 제네릭 함수를 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
fn add <T : std::ops::Add<Output = T>>(a : T, b : T) -> T { return a + b; } fn main() { println!("{}", add(10, 25)); println!("{}", add(10.0, 25.0)); println!("{}", add::<i32>(10, 25)); // 타입을 명시하는 경우 } /* 35 35 35 */ |
■ trait 키워드를 사용해 트레잇을 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
trait TreasureBox { fn open(&self, key_number : i32) -> bool; fn check(&self); } struct JewelryBox { price : i32, key_number : i32 } impl TreasureBox for JewelryBox { fn open(&self, key_number : i32) -> bool { return self.key_number == key_number; } fn check(&self) { println!("보석 상자 : {} 골드", self.price); } } struct TrapBox { damage : i32 } impl TreasureBox for TrapBox { fn open(&self, _key: i32) -> bool { return true; } fn check(&self) { println!("함정 상자 : 감소 HP {}", self.damage); } } fn open_box(treasure_box : &impl TreasureBox, key_number : i32) { if !treasure_box.open(key_number) { println!("적절한 열쇠가 아니라 상자가 열리지 않는다."); return; } treasure_box.check(); } fn main() { let jewelry_box1 : JewelryBox = JewelryBox { price : 30, key_number : 1 }; let trap_box1 : TrapBox = TrapBox { damage : 3 }; let jewelry_box2 : JewelryBox = JewelryBox { price : 20, key_number : 2 }; let key_number : i32 = 2; open_box(&jewelry_box1, key_number); open_box(&trap_box1 , key_number); open_box(&jewelry_box2, key_number); } /* 적절한 열쇠가 아니라 상자가 열리지 않는다. 함정 상자 : 감소 HP 3 보석 상자 : 20 골드 */ |
■ struct 키워드에서 Clone 트레잇을 자동으로 구현하는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
#[derive(Clone)] struct Person { name : String, age : i32 } impl Person { fn new(name : &str, age : i32) -> Self { return Self { name : name.to_string(), age }; } } fn main() { let person1 = Person::new("Alex", 18); let mut person2 = person1.clone(); person2.name = String::from("Betty"); println!("{},{}", person1.name, person1.age); println!("{},{}", person2.name, person2.age); } |