프로그래밍/Rust 3

간단한 예시로 알아보는 iter vs into_iter 차이

iter() &T를 iterate한다: 컬렉션의 Immutable Reference를 생성하여 iterate 수행 컬렉션의 요소를 읽기만 가능하고 수정할 수 없는 상태다. 이를 통해 컬렉션의 요소에 안전하게 접근할 수 있다. let vec = vec![1, 2, 3, 4, 5]; let iter = vec.iter(); // vec에 접근 가능하다. println!("{:?}", vec); into_iter() T를 iterate한다: 컬렉션의 소유권을 가져와서 컬렉션을 소비(consume)하는 Iterator 생성. 컬렉션을 iterate하는 동안 원본 데이터를 소비함을 의미한다. let vec = vec![1, 2, 3, 4, 5]; let iter = vec.into_iter(); // 여기서부터는..

[Rust] Option<T>가 Null보다 나은 이유(번역)

Null의 문제점 Rust에는 다른 많은 프로그래밍 언어에서 있는 Null이 없다. Null은 값이 없음을 의미하는 값이다. Null이 있는 언어에서, 변수는 항상 Null, 또는 Not-null 두가지 상태 중 하나에 있다. Null의 발명자인 Tony Hoare는 2009년 발표 "Null References: The Billion Dollar Mistake"에서 이렇게 얘기했다: "나는 그것을 10억 달러짜리 실수라고 부릅니다. 그 당시 저는 객체 지향 언어에서 참조에 대한 최초의 포괄적인 타입 시스템을 설계하고 있었습니다. 모든 참조의 사용이 컴파일러에 의해 자동으로 검사되도록 보장하는 것이 목표였습니다. 하지만 null 참조를 넣는 유혹을 이기지 못했습니다. 구현하기가 너무 쉽기 때문입니다. 이..

[Rust] Stack과 Heap (번역)

Stack과 Heap 많은 프로그래밍 언어에서는 스택(Stack)과 힙(Heap)에 대해 자주 생각할 필요가 없다. 그러나 시스템 프로그래밍 언어인 Rust에서는 값이 스택에 있거나 힙에 있는지 여부가 언어의 동작 방식과 특정 결정을 내리는 이유에 영향을 미친다. 스택에 대하여 스택과 힙은 모두 런타임(Runtime)에 코드가 사용할 수 있는 메모리의 일부이지만 구조가 다르다. 스택은 값을 가져온 순서대로 저장하고 반대 순서로 값을 제거한다. 이것을 "Last In, First Out" (LIFO)라고 한다. 접시 더미를 생각해보라. 접시를 더 추가하면 더미 위에 놓고 접시가 필요할 때는 가장 위에서 하나씩 가져온다. 중간이나 바닥에서 접시를 추가하거나 제거하는 것은 그다지 효과적이지 않을 것이다. 데이..