자기개발하는 QA
Rust 01 본문
시작전
사용 PC : Mac Book Pro 14'' M1
Compiling hello v0.1.0
error: linking with `cc` failed: exit code: 1
|
= note: "cc" "-arch arm64"
이런 형식의 에러가 계속 발생 -> X-code 최신 업데이트가 필요하다고 해서 최신으로 설치
에러 계속 발생 -> X-code developer 가 자동으로 설치되지 않아서 발생된 문제
아래 스택오버플로우가 도와줌 ㅠ
https://stackoverflow.com/questions/28124221/error-linking-with-cc-failed-exit-code-1
error: linking with `cc` failed: exit code: 1
I have a single .rs file. When I compile it by rustc test1.rs, I get an error: error: linking with `cc` failed: exit code: 1 note: cc '-m64' '-L' '/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/
stackoverflow.com
fn greet_world() {
println!("Hello, world!"); // <1>
let southern_germany = "Grüß Gott!"; // <2>
let japan = "ハロー・ワールド"; // <3>
let regions = [southern_germany, japan]; // <4>
for region in regions.iter() { // <5>
println!("{}", ®ion); // <6>
}
}
fn main() {
greet_world(); // <7>
}
-> &는 읽기 전용
fn main() { // <1> <2>
let penguin_data = "\
common name,length (cm)
Little penguin,33
Yellow-eyed penguin,65
Fiordland penguin,60
Invalid,data
";
let records = penguin_data.lines();
for (i, record) in records.enumerate() {
if i == 0 || record.trim().len() == 0 { // <3>
continue;
}
let fields: Vec<_> = record // <4>
.split(',') // <5>
.map(|field| field.trim()) // <6>
.collect(); // <7>
if cfg!(debug_assertions) { // <8>
eprintln!("debug: {:?} -> {:?}",
record, fields); // <9>
}
let name = fields[0];
if let Ok(length) = fields[1].parse::<f32>() { // <10>
println!("{}, {}cm", name, length); // <11>
}
}
}
-> \ 는 줄바꿈을 피한다 {} default template {:?} object 등의 템플릿 {:#?} object new line
#[derive(Debug)] // <1>
enum Cereal { // <2>
Barley, Millet, Rice,
Rye, Spelt, Wheat,
}
fn main() {
let mut grains: Vec<Cereal> = vec![]; // <3>
grains.push(Cereal::Rye); // <4>
drop(grains); // <5>
println!("{:?}", grains); // <6>
}
댕글링 포인터를 컴퍼일시에 에러로 확인 가능
use std::thread; // <1>
fn main() {
let mut data = 100;
thread::spawn(|| { data = 500; }); // <2>
thread::spawn(|| { data = 1000; }); // <2>
println!("{}", data);
}
멀티 쓰레드에서 경합 조건이 발생할때 컴파일시 에러 메시지 발생 mut 가 아닌경우 쓰레드가 아니라 data에 수정 접근할떄 에러 발생
fn main() {
let fruit = vec!['🥝', '🍌', '🍇'];
let buffer_overflow = fruit[4]; // <1>
assert_eq!(buffer_overflow, '🍉') // <2>
}
버퍼 오버플로가 발생하는 경우 컴파일 에러 발생
fn main() {
let mut letters = vec![ // <1>
"a", "b", "c"
];
for letter in letters {
println!("{}", letter);
letters.push(letter.clone()); // <2>
}
}
반복중에 배열에 접근, 변경하는 변경
use std::rc::Rc;
use std::sync::{Arc, Mutex};
fn main() {
let a = 10;
let b = Box::new(20);
let c = Rc::new(Box::new(30));
let d = Arc::new(Mutex::new(40));
println!("a: {}, b: {}, c: {}, d: {:#?}", a, b, c, d);
}
a - 스택 b - 힙 c - 힙 + 레퍼런스 카운터 + 싱글 쓰레드 d - 멀티 쓰레드 + 레퍼런스 카운터 + 락(poisoning)을 통한 멀티 쓰레드 프로텍팅
ref. https://rinthel.github.io/rust-lang-book-ko/appendix-04-macros.html