将字符串的值限制为 Rust 中的某个集合

问题描述 投票:0回答:2

如何将字符串的值限制为 Rust 中的某个集合?

// string literal union type with
// values of "admin", "owner", "user"
type Roles = "admin" | "owner" | "user";

// use the type "Roles" for the "role" variable
let role: Roles;

// assing a value other than "admin", "owner", "user"
role = "Hello World!"; // ❌ not allowed. Type '"Hello World!"' is not assignable to type 'Roles'

// assign a valid string value
role = "admin"; // ✅ allowed.

rust 的等价物是什么

string rust
2个回答
5
投票

您可以为您的角色使用

enum
,然后使用序列化方法(例如使用
strum
serde
)来解析任何字符串输入并验证它们是否可以应用。

这是一个使用扫弦的示例:



use std::str::FromStr;
use strum_macros::EnumString;

#[derive(Debug, PartialEq, EnumString)]
#[strum(ascii_case_insensitive)]
enum Role {
    Admin,
    Owner,
    User,
}

// tests
let admin = Role::from_str("admin").unwrap();
assert_eq!(Role::Admin, admin);


1
投票

接受的答案指出了正确的方向,但在细节上有点缺乏。

首先安装

strum
所需的功能:

cargo add strum --features derive,strum_macros

enum
中定义字符串(注意,使用自定义
serialize
属性,您可以输入所需的任何字符串格式):

#[derive(Debug, PartialEq, EnumString, strum::Display)]
enum Role {
    #[strum(serialize = "admin")]
    Admin,

    #[strum(serialize = "Owner")]
    Owner,

    #[strum(serialize = "regular user")]
    User,

    #[strum(serialize = "GUEST")]
    Guest,
}

要从字符串转换为枚举,它依赖于 FromStr 特征 (

use std::str::FromStr
):

let admin = Role::from_str("admin").unwrap();
assert_eq!(Role::Admin, admin);

let owner = Role::from_str("Owner").unwrap();
assert_eq!(Role::Owner, owner);

let user = Role::from_str("regular user").unwrap();
assert_eq!(Role::User, user);

let guest = Role::from_str("GUEST").unwrap();
assert_eq!(Role::Guest, guest);

从枚举转换为字符串 (

strum::Display
):

let admin_str = Role::Admin.to_string();
assert_eq!("admin", admin_str);

let owner_str = Role::Owner.to_string();
assert_eq!("Owner", owner_str);

let user_str = Role::User.to_string();
assert_eq!("regular user", user_str);

let guest_str = Role::Guest.to_string();
assert_eq!("GUEST", guest_str);
© www.soinside.com 2019 - 2024. All rights reserved.