C++ 및 Rust의 전송 값
그러나 언어마다 프로그램을 작성하는 체험은 크게 다를 수 있다.이러한 차이가 발생하면 Rust의 초보자들은 값을 통해 파라미터를 전달할 때 어떤 일이 일어날지 곧 알게 될 것이다.Rust가 이런 상황을 처리하는 방식은 C++와 다르기 때문에 원인을 탐구할 필요가 있다.
C++
C++에서 값 전달을 통해 대상의 사본을 함수에 전달합니다.이것은 정수와 같은 기본체에 아주 좋다. 나의 5와 너의 5는 같다.그것들은 메모리에서 서로 다른 값이다. 이 사실은 그것들의 사용에 아무런 영향을 주지 않는다. 왜냐하면 5의 의미는 상하문이나 상태에 의존하지 않기 때문이다.하지만 이런 일도 많다.C++에서 객체를 복사할 때 복제 구조 함수가 호출됩니다.이러한 원형은 다음과 같습니다.
classname (const classname &obj);
class CoolObject
{
    int coolValue;
public:
    CoolObject()
    {
        coolValue = 5;
    }
    int getCoolValue() const
    {
        return coolValue;
    }
    void setCoolValue(int val)
    {
        coolValue = val;
    }
};
#include <iostream>
void setCoolValueToTen(CoolObject co)
{
    using std::cout;
    cout << "Current: " << co.getCoolValue() << " | Setting...\n";
    co.setCoolValue(10);
    cout << "New: " << co.getCoolValue() << "\n";
};
int main()
{
    using std::cout;
    CoolObject co1;
    CoolObject co2;
    cout << "co1: " << co1.getCoolValue() << " | co2: " << co2.getCoolValue() << "\n";
    setCoolValueToTen(co2);
    cout << "co1: " << co1.getCoolValue() << " | co2: " << co2.getCoolValue();
    return 0;
}
co1: 5 | co2: 5
Current: 5 | Setting...
New: 10
co1: 5 | co2: 5
값에 따라 전달되면 모든 변경 사항이 이 새 로컬 복사본에 끼어 예상한 목표로 되돌아오지 않습니다.원문을 참고하면 이 문제를 해결할 수 있다.
void reallySetCoolValueToTen(CoolObject &co) // Just take a reference - rest is identical!
{
    using std::cout;
    cout << "Current: " << co.getCoolValue() << " | Setting...\n";
    co.setCoolValue(10);
    cout << "New: " << co.getCoolValue() << "\n";
}
int main()
{
    using std::cout;
    CoolObject co1;
    CoolObject co2;
    cout << "co1: " << co1.getCoolValue() << " | co2: " << co2.getCoolValue() << "\n";
    setCoolValueToTen(co2);
    cout << "co1: " << co1.getCoolValue() << " | co2: " << co2.getCoolValue() << "\n";
    reallySetCoolValueToTen(co2);
    cout << "co1: " << co1.getCoolValue() << " | co2: " << co2.getCoolValue() << "\n";
    return 0;
}
co1: 5 | co2: 5
Current: 5 | Setting...
New: 10
co1: 5 | co2: 5
Current: 5 | Setting...
New: 10
co1: 5 | co2: 10
녹슬다
Rust에서 이 애플릿을 다시 실현해 봅시다.다음은 Dell
CoolObject입니다.struct CoolObject {
    cool_value: i32,
}
impl CoolObject {
    fn get_cool_value(&self) -> i32 {
        self.cool_value
    }
    fn set_cool_value(&mut self, val: i32) {
        self.cool_value = val;
    }
}
impl Default for CoolObject {
    fn default() -> Self {
        Self { cool_value: 5 }
    }
}
fn set_cool_value_to_ten(mut co: CoolObject) {
    println!("Current: {} | Setting...", co.get_cool_value());
    co.set_cool_value(10);
    println!("New: {}", co.get_cool_value());
}
mut를 매개 변수 목록에 포함하지 않았다면, set_cool_value() 호출은 "co를 가변적으로 대여할 수 없다. 왜냐하면 그것은 가변적으로 성명되지 않았기 때문이다."라고 불평할 것이다.우리는 컴파일러에게 우리가 대상에 대해 변이를 진행할 계획이라고 명확하게 알려야 한다.C++ 버전을 에뮬레이션하기 위한 첫 번째 단계를 살펴보겠습니다.
fn main() {
    let co1 = CoolObject::default();
    let co2 = CoolObject::default();
    println!("co1: {} | co2: {}", co1.get_cool_value(), co2.get_cool_value());
    set_cool_value_to_ten(co2);
    println!("co1: {} | co2: {}", co1.get_cool_value(), co2.get_cool_value());
}
error[E0382]: borrow of moved value: `co2`
  --> src/main.rs:34:57
   |
31 |     let co2 = CoolObject::new();
   |         --- move occurs because `co2` has type `CoolObject`, which does not implement the `Copy` trait
32 |     println!("co1: {} | co2: {}", co1.get_cool_value(), co2.get_cool_value());
33 |     set_cool_value_to_ten(co2);
   |                           --- value moved here
34 |     println!("co1: {} | co2: {}", co1.get_cool_value(), co2.get_cool_value());
   |                                                         ^^^ value borrowed here after move
error: aborting due to previous error
녹이 슬어 브레이크가 고장나다.값을 전달할 때, 실제 값의 소유권을 이동합니다.그것은 원시 대상을 복제하는 것이 아니라 외부에서 대상을 도입하는 것이다. 그러나 주의해야 할 것은 호출 범위는 더 이상 이 값을 가지지 않고, 새 함수는 이 값을 가지고 있다.
set_cool_value_to_ten() 주체의 끝에 도달했을 때 이 값은 범위를 초과합니다!얘 떨어졌어.우리가 다음 줄에서 다시 인용하려고 시도할 때 co2, 우리는 할 수 없다. 그것은 더 이상 우리의 것이 아니다.Rust의 모든 가치는 소유자 하나뿐입니다.너는 임의의 여러 개의 변할 수 없는 인용을 빌릴 수 있다. 우리가
get_cool_value(&self)를 호출했을 때 이렇게 하거나, 예를 들어 really_set_cool_value_to_ten(co: &mut CoolObject)를 빌릴 수 있지만, 만약 빌리지 않았다면, 예를 들어 set_cool_value_to_ten(mut co: CoolObject) 이 값의 소유권이 바뀔 것이라는 것을 알 수 있다.이것은 C++에서 흔히 볼 수 있는 전달 값 오류를 피합니다. 즉, 대상을 처리하고 있다고 생각하지만, 실제로는 복사본만 처리하고 있습니다.C++는 묵묵히 일을 시작하려고 시도할 뿐이며, 당신과 같은 페이지에 없을 수도 있습니다.녹이 슬는 것은 매우 뚜렷하다.대상이
Copy 특징을 실현하면, 이 값을 복제하려고 시도할 수도 있다는 것을 명확하게 알려준다. 물론, 이것은 여전히 이 문제를 해결할 수 없다.C++와 마찬가지로 해결 방안은 원본 값을 인용하는 것이지 이동 값을 인용하는 것이 아니다.C++에서는 "인용"이라고 말하지만, Rust에서는 "가변 대여"라고 부른다.fn really_set_cool_value_to_ten(co: &mut CoolObject) {
    println!("Current: {} | Setting...", co.get_cool_value());
    co.set_cool_value(10);
    println!("New: {}", co.get_cool_value());
}
co2 자체가 변할 수 있다는 것을 성명해야 한다.fn main() {
    let co1 = CoolObject::default();
    let mut co2 = CoolObject::default(); // right here
    println!("co1: {} | co2: {}", co1.get_cool_value(), co2.get_cool_value());
    really_set_cool_value_to_ten(&mut co2); // and pass a mutable reference
    println!("co1: {} | co2: {}", co1.get_cool_value(), co2.get_cool_value());
}
Natalia Y 의 Unsplash 사진
Reference
이 문제에 관하여(C++ 및 Rust의 전송 값), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/deciduously/pass-by-value-in-c-and-rust-1jo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)