프로그래밍/프로그래밍언어 16

[rust] Struct & #[derive(Debug)]

Rust Language Book 에서 chapter 5.2 에서 struct을 배우는 간단한 프로그래밍인데, Debug를 위한 rust 기능들이 있어서 이를 기록하기 위해서 작성하였다. 간단하게 struct는 c/c++에서 사용하는 방법과 비슷한다. struct Rectangle { width : u32, height : u32, } fn main() { let rect1 = Rectangle { width : 30, height : 50, }; println!("rect1 is {}", rect1); // Compile error } /* 에러 내용 = help: the trait `std::fmt::Display` is not implemented for `Rectangle` = note: in f..

[rust] Ownership 3 - Reference

C++에서 reference를 알고계시면 이해하기 조금 더 수월하다. 기존의 Ownership Rule은 string을 함수의 매개변수로 넘겨주게 되면 Ownership을 넘겨주는 것이라서, 함수가 끝나고 변수가 invalid되는 것이다. 이를 해결하기 위해 나온 개념이 reference이다. Ownership을 넘겨주는 것이 아닌, pointer를 넘겨주면서 함수이후 변수가 invalid가 되는 것을 방지한다. fn main(){ let s1 = String::from("hello"); let len = calculate_length(&s1); println!("The length of '{}' is {}.",s1,len); } fn calculate_length(s : &String) -> usize..

[rust] Ownership 2

Ownship 을 리턴 값이 있는 함수에서 보자. fn main() { let s1 = gives_ownership(); let s2 = String::from("hello"); let s3 = takes_and_gives_back(s2); } fn gives_ownership() -> String { let something = String::from("yours"); something } fn takes_and_gives_back(a_string: String) -> String { a_string } 함수에서 문법은 코틀린과 비슷하다. 메인 함수에서 s1,s2,s3을 선언한다. s1 변수부터 보면 gives_ownership 함수에서 리턴 값을 받아온다. 해당 함수에서 something 변수는 함수..

[rust] Ownership 1

Stack과 heap에 대한 이해가 필요하다. 일반적으로 (스크립트언어가 아니라면) 컴파일 타임에 size를 알수없는경우 heap에 저장한다고 보면 된다. 특징 1. 모든 변수는 scope를 벗어나면 invalid 된다. Ownership Rules 1. 러스트의 모든 value는 owner를 가지고 있다. 2. 하나의 owner만 가질 수 있다. 3. scope를 벗어나면, value는 없어진다. 가비지컬렉션을 사용하지 않는 언어에서는 직접 메모리를 할당/해제해주어야 하는데, rust에서는 ownership이라는 것을 이용한다. (이를 통해 안전하고 효율적으로 코드를 짤 수 있다고 한다.) 예시 (string literal의 경우 스택에 저장된다.) {// s는 invalid한 상황. let s = "..

[rust] note: the msvc targets depend on the msvc linker but `link.exe` was not found

에러 note: the msvc targets depend on the msvc linker but `link.exe` was not found note: please ensure that VS 2013, VS 2015, VS 2017 or VS 2019 was installed with the Visual C++ option 상황 scoop을 통해 rust를 uninstall하고 rustup을 다시 설치하였다. 그 이후 cargo build를 하려고하니 해당 에러가 발생하였다. msvc 계열은 보통 visual studio 에서 많이 붙는 네이밍인데, 나는 보통 gcc/g++과 같은 gnu 계열을 사용하오 있는 상황이었다.(이전 rust도 gcc설치하고 사용했었음) 해결법 rustup show 커맨드로..

[rust] 윈도우에서 러스트 시작해보기

윈도우에서 환경변수 설정, 커맨드를 통한 패키지 설치가 어려워서, scoop을 활용을 이용하였다. (보통 개발시 wsl을 활용하여 개발한다.) 예전에 설치해서 기억이 안나서, 다른 링크로 공유하겠다. https://okky.kr/article/592228 OKKY | 개발툴 및 어플을 편하게 설치 해주는 scoop 커멘드라인 인스톨러 안녕하셔요. 팁이라고 하기에도 뭐하지만.. 윈 7시절부터 쓰다보니 워낙 편해서 한번 올려봅니다. 아래는 공홈이구요. OFFICIAL HOMEPAGE : https://scoop.sh/ 개발툴 및 어플을 커멘드라인 몇줄로 아주 편 okky.kr scoop은 리눅스에서 apt, 맥북에서의 homebrew라고 생각하면 좋다. 설치가 되었다면, 해당 명령어로 필요한 것을 설치한다...

[4장 고차함수] 4.5 합성 함수

합성 함수 : 수학에서 합성함수와 같다. 함수를 매개변수로 받고, 함수를 반환할 수 있는 고차 함수를 이용해서 두 개의 함수를 결합하는 것. fun main(args: Array){ println(composed(3)) } fun composed(i : Int) : addThree(twice(i)) fun addThree(i: Int) = i+3 fun twice(i: Int) = i*2 composed 함수가 합성 함수의 예시이다. 이 함수를 일반화해보자. fun main(args: Array){ val addThree = { i :Int -> i+3 } val twice = { i : Int -> i*2 } val composedFunc = addThree compose twice println(co..

[4장 고차함수] 커링함수 - 확장함수 만들기

지난번에는 일반 함수와 커링함수를 직접 만들어서 구현하였다. 코틀린은 기본함수로 커링을 제공하지 않기때문에, 이를 지원하기 위해 커링함수를 확장함수로 구현해본다. 다음 코드는 매개변수 3개인 함수를 커링함수로 바꾸어주는 함수 코드이다. fun ((P1,P2,P3)->R).curried() : (P1) -> (P2) -> (P3) -> R = { p1:P1 -> {p2:P2 -> {p3:P3 -> this(p1,p2,p3) } } } fun ((P1) -> (P2) -> (P3) -> R).uncurried() : (P1,P2,P3)->R= { p1:P1, p2:P2, p3:P3 -> this(p1)(p2)(p3) } curried 함수를 통해 커링함수 아닌 것을 커링함수로 구현하고, uncurried 함..

[4장 고차함수] 커링함수

커링(currying) : 여러개의 매개변수 받는 함수를 분리 -> 단일매개변수로 받는 체인 함수 아래의 예시를 보자. fun addTwo(a : Int, b : Int) : Int = a+b fun addTwoCurried(a : Int) : {b : Int -> { a+b } } addTwo와 같이 a,b 두개의 매개변수로 받는 함수를 addTwoCurried와 같이 매개 변수 하나씩 받으며 하나의 체인으로 연결되는 함수를 의미한다. addTwo(1,2) 와 addTwoCurried(1)(2) 와 동일한 3을 출력한다. 커링으로 변환해주는 함수는 아래와 같을 것이다. fun addTwo(a : Int, b : Int) : Int = a+b fun addTwoCurried(a : Int) : {b : ..

[4장 고차함수] 4.3 부분 적용 함수

부분 함수와 이름이 비슷하지만 관계없다. 부분 적용 함수 : 말그대로 부분적으로 적용한 함수이다. 매개변수의 일부만 전달받았을 때, 제공받은 매개변수만 가지고 연산하는 함수이다. fun main(args: Array){ val func = {a : String, b : String -> a+b} val partiallyAppliedFunc = func.partial("Hi"); // 매개변수 a,b중 a만 적용 : 부분적용됨 val ret = partiallyAppliedFunc(" Hello");// a,b 둘다 적용된 상태 println("result : $ret ") } fun ((P1,P2)-> R).partial(p1: P1) : P2 ->R { return { p2 -> this(p1,p2) ..

반응형