■ 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 */ |
■ ? 연산자를 사용해 에러를 전파하는 방법을 보여준다. ▶ 예제 코드 (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
|
use std::fs; use std::io; use std::io::Read; fn read_file() -> Result<String, io::Error> { let mut file : fs::File = fs::File::open("hello.txt")?; let mut file_content : String = String::new(); file.read_to_string(&mut file_content)?; return Ok(file_content); } fn main() { let file_content : String = read_file().unwrap(); println!("{}", file_content); } |
※ ? 연산자는 Result를 반환하는 함수 내에서만 사용할 수
더 읽기
■ 함수 정의시 에러를 전파하는 방법을 보여준다. ▶ 예제 코드 (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
|
use std::fs; use std::io; use std::io::Read; fn read_file() -> Result<String, io::Error> { let result : Result<fs::File, io::Error> = fs::File::open("hello.txt"); let mut file : fs::File = match result { Ok(file) => file, Err(e) => return Err(e) }; let mut file_content : String = String::new(); match file.read_to_string(&mut file_content) { Ok(_) => return Ok(file_content), Err(e) => return Err(e) }; } |
■ Error 구조체의 kind 메소드를 사용해 서로 다른 에러를 처리하는 방법을 보여준다. ▶ 예제 코드 (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
|
use std::fs; use std::io; let result : Result<fs::File, io::Error> = fs::File::open("hello.txt"); let file : fs::File = match result { Ok(file) => file, Err(ref error) if error.kind() == io::ErrorKind::NotFound => { match fs::File::create("hello.txt") { Ok(file2) => file2, Err(error2) => { panic!("Tried to create file but there was a problem: {:?}", error2); } } }, Err(error) => { panic!("There was a problem opening the file: {:?}", error); } }; |
■ panic! 매크로를 사용해 에러를 처리하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
use std::fs; use std::io; let result : Result<fs::File, io::Error> = fs::File::open("hello.txt"); let file : fs::File = match result { Ok(file) => file, Err(error) => { panic!("There was a problem opening the file : {:?}", error) } }; |
■ 패닉 발생시 즉시 그만두는(abort) 방법을 보여준다. ▶ Cargo.toml
|
... [profile.release] panic = 'abort' ... |
■ panic! 매크로를 사용해 에러 메시지를 표시하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
panic!("crash and burn"); |
■ HashMap 구조체에서 벡터 객체를 사용해 해시맵을 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
|
use std::collections; let color_vector : Vec<String> = vec![String::from("Blue"), String::from("Yellow")]; let value_vector : Vec<i32> = vec![10, 50]; let score_hashmap : collections::HashMap<_, _> = color_vector.iter().zip(value_vector.iter()).collect(); println!("{:?}", score_hashmap); /* {"Blue": 10, "Yellow": 50} */ |
■ 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 */ |
■ String 구조체에서 + 연산자를 사용해 문자열을 결합하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let string1 : String = String::from("Hello, "); let string2 : String = String::from("world!"); let string3 = string1 + &string2; // string1의 소유권이 이동되었다. println!("{}", string3); |
■ String 구조체의 push 메소드를 사용해 문자를 추가하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let mut string : String = String::from("tes"); string.push('t'); println!("{}", string); /* test */ |
■ String 구조체의 push_str 메소드를 사용해 문자열을 추가하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let mut string : String = String::from("AAA"); string.push_str(" BBB"); println!("{}", string); /* AAA BBB */ |
■ Vec<T> 구조체에서 열거형을 사용해 복수 타입을 저장하는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
#[derive(Debug)] enum Cell { Int(i32), Float(f64), Text(String) } let vector : Vec<Cell> = vec! [ Cell::Int(3), Cell::Text(String::from("blue")), Cell::Float(10.12) ]; println!("{:?}", vector); |
■ Vec<T> 구조체에서 각 요소에 대한 가변 참조자를 구해서 요소 값을 변경하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let mut vector : Vec<i32> = vec![100, 30, 50]; for item in &mut vector { *item += 50; } println!("{:?}", vector); |
■ Vec<T> 구조체에서 각 요소에 대한 불변 참조자를 구해서 요소 값을 출력하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let vector : Vec<i32> = vec![100, 30, 50]; for item in &vector { println!("{}", item); } |
■ Vec<T> 구조체의 get 메소드를 사용해 요소를 참조하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let vector : Vec<i32> = vec![1, 2, 3, 4, 5]; let element : Option<&i32> = vector.get(2); println!("{:?}", element); |
■ Vec<T> 구조체에서 요소를 참조하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let vector : Vec<i32> = vec![1, 2, 3, 4, 5]; let element : &i32 = &vector[2]; println!("{}", element); |
■ Vec<T> 구조체의 push 메소드를 사용해 요소를 추가하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let mut vector : Vec<&str> = Vec::new(); vector.push("a"); vector.push("b"); vector.push("c"); println!("{:?}", vector); |
■ Option<T> 열거형의 Some(T) 변형에서 T 타입의 값을 구하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let option : Option<i32> = Some(10); let value : i32 = match option { Some(v) => v, None => panic!("Option is None") }; println!("{}", value); |
■ Option<T> 열거형에서 let if문을 사용하는 방법을 보여준다. ▶ 예제 코드 (RS)
|
let option : Option<i32> = Some(10); let value : i32 = if let Some(v) = option { v * 2 } else { 0 }; println!("{}", value); |