gpt4 book ai didi

types - 如何在 Rust 中为相似但不同的类型重用代码?

转载 作者:行者123 更新时间:2023-11-29 08:23:15 25 4
gpt4 key购买 nike

我有一个具有某些功能的基本类型,包括特征实现:

use std::fmt;
use std::str::FromStr;

pub struct MyIdentifier {
value: String,
}

impl fmt::Display for MyIdentifier {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.value)
}
}

impl FromStr for MyIdentifier {
type Err = ();

fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(MyIdentifier {
value: s.to_string(),
})
}
}

这是一个简化的示例,实际代码会更复杂。

我想介绍两种类型,它们与我描述的基本类型具有相同的字段和行为,例如 MyUserIdentifierMyGroupIdentifier。为避免在使用它们时出错,编译器应将它们视为不同的类型。

我不想复制我刚写的整个代码,我想重用它。对于面向对象的语言,我会使用继承。我将如何为 Rust 做这个?

最佳答案

使用 PhantomData将类型参数添加到您的 Identifier。这允许您“标记”给定的标识符:

use std::{fmt, marker::PhantomData, str::FromStr};

pub struct Identifier<K> {
value: String,
_kind: PhantomData<K>,
}

impl<K> fmt::Display for Identifier<K> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.value)
}
}

impl<K> FromStr for Identifier<K> {
type Err = ();

fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Identifier {
value: s.to_string(),
_kind: PhantomData,
})
}
}

struct User;
struct Group;

fn main() {
let u_id: Identifier<User> = "howdy".parse().unwrap();
let g_id: Identifier<Group> = "howdy".parse().unwrap();

// do_group_thing(&u_id); // Fails
do_group_thing(&g_id);
}

fn do_group_thing(id: &Identifier<Group>) {}
error[E0308]: mismatched types
--> src/main.rs:32:20
|
32 | do_group_thing(&u_id);
| ^^^^^ expected struct `Group`, found struct `User`
|
= note: expected type `&Identifier<Group>`
found type `&Identifier<User>`

不过,以上内容并不是我自己实际做的。

I want to introduce two types which have the same fields and behaviour

两种类型不应该有相同的行为——它们应该是相同的类型。

I don't want to copy the entire code I just wrote, I want to reuse it instead

然后重用它。我们一直重复使用 StringVec 等类型,将它们组合成更大类型的一部分。这些类型的行为不像 StringVec,它们只是使用它们。

也许标识符是您领域中的原始类型,它应该存在。创建类似 UserGroup 的类型并传递(引用)用户或组。您当然可以添加类型安全,但这确实需要一些程序员付出代价。

关于types - 如何在 Rust 中为相似但不同的类型重用代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56500357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com