Table of Contents
Rust 요약(기초)
설치하기
curl https://sh.rustup.rs -sSf | sh
Hello, World!
프로젝트 생성
cargo new hello --bin
cd hello
ls -al
빌드
cargo build
실행
./target/debug/hello
변수생성
원격에서 ssh 연결 을 설정해 두면 편하다.
vi src/main.rs
가변형 / 불변형
rust 기본적으로 모든 변수는 불변형이다.(변경 불가)
mut
키워드를 붙여서 가변형 변수로 생성할 수 있다.
또는 기존에 선언한 변수를 다시 선언하면서 값을 바꾸는 것은 가능하다.
fn main() {
let a = 1;
a = a + 1; // compile error
let mut b = 1;
b = b + 1; // ok
}
정수형
overflow 에 상당히 민감하다.
cast 연산자를 붙여 주어야 오류가 발생하지 않는다.
use std::any::type_name;
fn type_of<T>(_: T) -> &'static str {
type_name::<T>()
}
fn main() {
let a: i8 = -128;
let b: u8 = 255;
println!("Signed a == {}, Unsigned b == {}", a, b);
let a: i16 = 2;
let c: i32 = a.pow(14) as i32;
println!("c == {}", c);
let d = 100;
println!("type of d is {}", type_of(d));
}
Signed a == -128, Unsigned b == 255
c == 16384
type of d is i32
부동 소수점
상황에 따라 타입이 변한다.
fn main() {
let x = 2.0;
println!("type of x is {}", type_of(x)); // f64
}
fn main() {
let x = 2.0;
let y: f32 = 3.0;
let z = x * y;
println!("type of x is {}", type_of(x)); // f32
println!("type of z is {}", type_of(z)); // f32
}
Boolean형
fn main() {
let a = true;
println!("type of a is {}", type_of(a));
}
type of a is bool
문자형
fn main() {
let c = 'A';
println!("type of c is {}", type_of(c));
}
type of c is char
복합형(tuple)
fn main() {
let (a, b, c) = (1, 2, 3);
println!("a + b + c == {}", (a + b + c));
}
배열(array)
fn main() {
let a = [1, 2, 3, 4, 5];
println!("a[1] == {}", a[1]);
}
제어문
괄호를 쓰면 컴파일러 경고가 뜬다.
if else
fn main() {
let a = 1;
if a > 1 {
println!("over");
} else if a < 1 {
println!("below");
} else {
println!("equal");
}
}
let if
fn main() {
let a = true;
let b = if a { 1 } else { 2 };
println!("b == {}", b);
}
let with block
블록으로 값을 지정할 수 있다.
fn main() {
let a = true;
let b = {
let a = 3;
a + 1
};
println!("b == {}", b);
}
switch case
없나??
반복구문
for
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a.iter() {
println!("{}", element);
}
println!("-----------");
for number in (1..4).rev() { // 4 는 제외
println!("{}", number);
}
}
10
20
30
40
50
-----------
3
2
1
while
fn main() {
let mut num = 10;
while num != 0 {
println!("{}", num);
num = num - 1;
}
}
loop
fn main() {
loop {
println!("forever");
}
}
함수(function)
fn main() {
function_without_parameter();
function_with_parameter(100, 200);
let a = function_with_return_value();
println!("a == {}", a);
}
fn function_without_parameter() {
println!("function without parameter");
}
fn function_with_parameter(x: i32, y: i32) {
println!("function with parameter x == {}, y == {}", x, y);
}
fn function_with_return_value() -> i32 {
5 // 세미콜론을 붙이면 오류가 발생한다.
}
구조체(struct)
fn main() {
let user1 = User {
email: String::from("someone@example.com"),
username: String::from("someusername123"),
// active: true,
// sign_in_count: 1,
};
println!("name of user1 is {}", user1.username);
println!("email of user1 is {}", user1.email);
}
struct User {
username: String,
email: String, // 마지막 콤마는 optional 이다.
// sign_in_count: u64,
// active: bool,
}
tuple struct
fn main() {
let black = Color(0, 0, 0);
let origin = Point(10, 0);
println!("R value of black is {}", black.0);
println!("x value of origin is {}", origin.0);
}
// tuple struct
struct Color(i32, i32, i32);
struct Point(i32, i32);
열거형(enum)
fn main() {
let id: String = "id".to_string();
let password: String = "abcd1234".to_string();
if check_login(id, password) == ErrorCode::Ok {
println!("login ok");
}
}
#[derive(PartialEq)]
enum ErrorCode {
Ok,
InvalidId,
InvalidPassword,
}
fn check_login(id: String, password: String) -> ErrorCode {
if id != "id" {
ErrorCode::InvalidId
} else if password != "abcd1234" {
ErrorCode::InvalidPassword
} else {
ErrorCode::Ok
}
}