【发布时间】:2019-09-08 10:20:31
【问题描述】:
我正在尝试将借用的结构传递给借用的枚举。
#[derive(Copy, Clone)]
pub struct CustomerData {
// Many fields about customers
}
#[derive(Copy, Clone)]
pub struct EmployeeData {
// Many fields about employees
}
pub enum Person {
Customer(CustomerData),
Employee(EmployeeData)
}
fn do_something_with_customer(customer: &CustomerData) {
let person = &Person::Customer(customer);
// This would work, but this can be a large struct.
// let person = &Person::Customer(customer.clone());
general_method(person);
}
fn do_something_with_employee(employee: &EmployeeData) {
let person = &Person::Employee(employee);
// This would work, but this can be a large struct.
// let person = &Person::Employee(employee.clone());
general_method(person);
}
fn general_method(person: &Person) {
}
fn main() {
let person = Person::Customer(CustomerData { });
match &person {
Person::Customer(data) => {
do_something_with_customer(data);
}
Person::Employee(data) => {
do_something_with_employee(data);
}
}
}
编译给了我结果:
error[E0308]: mismatched types
--> src/main.rs:19:36
|
19 | let person = &Person::Customer(customer);
| ^^^^^^^^
| |
| expected struct `CustomerData`, found reference
| help: consider dereferencing the borrow: `*customer`
|
= note: expected type `CustomerData`
found type `&CustomerData`
error[E0308]: mismatched types
--> src/main.rs:28:36
|
28 | let person = &Person::Employee(employee);
| ^^^^^^^^
| |
| expected struct `EmployeeData`, found reference
| help: consider dereferencing the borrow: `*employee`
|
= note: expected type `EmployeeData`
found type `&EmployeeData`
我知道 Rust 编译器不允许我这样做,但我觉得我应该能够这样做,考虑到我传递我的结构的枚举也是借用的。
这种情况有模式/解决方法吗?也许使用Rc 类型?我不想在这种情况下乱扔我的代码。
use std::rc::Rc;
#[derive(Copy, Clone)]
pub struct CustomerData {
// Many fields about customers
}
#[derive(Copy, Clone)]
pub struct EmployeeData {
// Many fields about employees
}
pub enum Person {
Customer(Rc<CustomerData>),
Employee(Rc<EmployeeData>)
}
fn do_something_with_customer(customer: Rc<CustomerData>) {
let person = &Person::Customer(customer);
// This would work, but this can be a large struct.
// let person = &Person::Customer(customer.clone());
general_method(person);
}
fn do_something_with_employee(employee: Rc<EmployeeData>) {
let person = &Person::Employee(employee);
// This would work, but this can be a large struct.
// let person = &Person::Employee(employee.clone());
general_method(person);
}
fn general_method(person: &Person) {
}
fn main() {
let person = Person::Customer(Rc::new(CustomerData { }));
match &person {
Person::Customer(data) => {
do_something_with_customer(data.clone());
}
Person::Employee(data) => {
do_something_with_employee(data.clone());
}
}
}
【问题讨论】:
标签: enums rust borrow-checker