note
- 다른 data types를 가질 수 있다는 점에서 tuple과 비슷하나 각 항목들의 data type을 정의 해줘야 한다는 점에서 다름
struct
keyword 사용 key: value
쌍 으로 정의note
- struct construct는 이를 초기화하는 함수의 위,아래 어디에서나 선언할 수 있음
note
- 네이밍은 PascalCase로 표기
첫 글자 = 대문자
ex). ThisIsPascalCase
note
- 항목에 값을 할당하는 순서는 중요하지 않음
StructName.itemame
note
- 구조체 인스턴스는 기본적으로 변경할 수 없음
- 따라서 변경 가능하지 않으면 업데이트할 수 없습니다
- 그러나 값에 액세스할 수 있습니다.
let
뒤에 mut
keyword 를 추가하여 구조체 인스턴스를 변경 가능하게 만들 수 있음.
연산자를 사용하여 모든 항목에 액세스할 수 있으며 항목 값을 업데이트할 수 있음//declare a struct
struct Course {
code:i32,
name:String,
level:String,
}
fn main() {
//initialize
let mut course1 = Course {
name:String::from("Rust"),
level:String::from("beginner"),
code:130,
};
let course2 = Course {
name:String::from("Javascript"),
level:String::from("beginner"),
code:122,
};
//access
println!("Name:{}, Level:{}, code: {}", course1.name, course1.level, course1.code);
println!("Name:{}, Level:{}, code: {}", course2.name, course2.level, course2.code);
//update
course1.name = "Java".to_string();
course1.code = 134;
println!("Name:{}, Level:{} ,code: {}", course1.name, course1.level, course1.code);
}
---------------------------------------
*console
Name:Rust, Level:beginner, code: 130
Name:Javascript, Level:beginner, code: 122
Name:Java, Level:beginner ,code: 134
fn function_name(S:StructName) {
statement1;
statement2;
.
.
statementN;
}
//declare a struct
struct Course {
code:i32,
name:String,
level:String,
}
fn display_mycourse_info(c:Course) {
println!("Name:{}, Level:{} ,code: {}", c .name, c .level, c.code);
}
fn main() {
//initialize
let course1 = Course {
name:String::from("Rust"),
level:String::from("beginner"),
code:130
};
display_mycourse_info(course1);
let course2 = Course {
name:String::from("Java"),
level:String::from("beginner"),
code:130
};
display_mycourse_info(course2);
}
//declare a struct
struct Course {
code:i32,
name:String,
level:String,
}
fn return_rust_course_info(c1:Course, c2:Course)-> Course{
println!("I got into function and return values from there");
if c1.name == "Rust" {
return c1;
}
else{
return c2;
}
}
fn main() {
//initialize
let course1 = Course {
name:String::from("Rust"),
level:String::from("beginner"),
code:130
};
let course2 = Course {
name:String::from("Java"),
level:String::from("beginner"),
code:130
};
let choose_course = return_rust_course_info(course1, course2);
println!("I choose to learn {} {} course with code:{}", choose_course.name, choose_course.level, choose_course.code);
}
&self
매개변수가 전달되며 함수 내의 항목은 이를 통해 액세스self.item
![(https://velog.velcdn.com/images/hunterjoe98/post/10487f39-15c5-4dc7-8314-27af9c6d82d2/image.PNG)
note
왜 구조체 메서드를 써야하는가?
- 가장 큰 장점은 인스턴스와 관련된 모든 데이터를 다른 곳에 두지 않고
impl
블록 안에 넣는다는 것impl
= implementation
//declare a struct
struct Course {
name: String,
level: String,
code:i32
}
//impl construct to define struct methods
impl Course {
fn name_code(&self) -> String {
format!("{} {}", self.name, self.code)
}
}
fn main() {
let course_1 = Course {
name: "Rust".to_string(),
level:"beginner".to_string(),
code:132
};
//call the non-static method
println!("This is a {} course: {}", course_1.level, course_1.name_code());
}
note
- 구문이
impl
keywordh로 선언된 경우 정적 or 동적 or 둘다 중에 있어야 함
::
: membership operator// declare a struct
struct Course {
name: String,
level:String,
code: i32,
}
impl Course {
// static method
fn my_static_method(n: String, l: String, c:i32) -> Course {
Course {
name: n,
level:l,
code:c
}
}
//display
fn display(&self){
println!("name :{} code:{} of type: {}", self.name, self.code, self.level );
}
}
fn main(){
// call the static method
let c1 = Course::my_static_method("Rust".to_string(), "beginner".to_string(), 132);
c1.display();
}
note
- 구조체는 인스턴스화 되지 않음
---
tuple structs
- tuple struct : tuple 과 struct의 하이브리드 기능을 가진 데이터 타입
struct
: keyword
struct tuple_name (datatype, datatype, datatype);
let a = tuple_name (v1,v2,v3);
------------------------------
v : value of variable
.
연산자와 동일 tuple_name.value
//define a tuple struct
struct FruitQuantity(String, i32);
// main function
fn main() {
// create an instance
let r1 = FruitQuantity("oranges".to_string(), 12);
// access values of a tuple struct
println!("r1--name:{} quantity:{}", r1.0, r1.1);
// create an instance
let r2 = FruitQuantity("mangoes".to_string(), 13);
// access values of a tuple struct
println!("r2--name:{} quantity:{}", r2.0, r2.1);
}