【问题标题】:Rust - Typescript - KeyofRust - 打字稿 - Keyof
【发布时间】:2023-02-16 00:47:40
【问题描述】:

我是 Rust 的新手,只是想知道 Rust 中是否有等同于 keyof(如 TypeScript 中)的运算符。

我不知道这是否可能,但我正在尝试访问另一个结构中结构的键和值。

例子:

interface Events {
   msg:(data:string)=>any,
   abort:()=>any
}

class EventEmitter<T>{
   on(event: keyof T,callback:T[keyof T])
}

我正在尝试在 Rust 中实现相同的 on 功能。

struct Events {
    msg: Fn(&str)->(),
    abort: Fn()->(),
}

struct EventEmitter<T> {
    pub listeners: Vec<Listener<T>>,
}


上下文:我正在尝试像 node.js & ts 一样重新创建EventEimtter

【问题讨论】:

  • 你到底想做什么?您不能像在动态语言中那样通过字符串名称访问结构成员。
  • @PitaJ 我正在尝试像在 node.js 中一样重新创建 EventEmitter 以用于学习目的,从而创建相同的功能。
  • 这根本没有帮助,因为您不能假设使用 Rust 的人对您要重现的内容有任何线索,但您从不解释它是什么,或者您实际上想要实现什么。然而,规则是,尝试 1:1 地在另一种语言中重现一种语言的功能往往不是一个好主意,尤其是当所讨论的两种语言分别是动态类型和弱类型时;并且几乎没有任何反射的静态类型。关于这个主题的经典文章是Python is not Java
  • @Masklinn 感谢您花时间澄清。正如我提到的,我是 Rust 的新手,可能会问一些看起来很愚蠢或不清楚的问题。我也可能在没有意识到的情况下尝试应用另一种语言的逻辑。对于那个很抱歉
  • 不,在 Rust 中没有像 keyof 运算符这样的东西存在。您可能可以通过编写特征来实现类似的目的,但您绝对不能对字符串进行强类型化。

标签: rust


【解决方案1】:

你描述的是reflection。正如在您的问题的 cmets 中提到的,Rust 没有将反射作为本机功能。使用 String 访问结构的成员可能会产生不可预测或未定义的行为。

如果访问具有相同类型的结构成员确实很重要,则可以考虑创建一个名为“Keyable”或类似名称的特征。这个结构应该(可能)看起来像这样。

pub trait Keyable<T> {
    fn get_string(&self, for_key: T) -> Option<&String>;
    fn get_i32(&self, key: T) -> Option<&i32>;
}
pub enum UserKeys {
    Id,
    Username,
    Password
}
pub struct User {
    id: i32,
    username: String,
    password: String
}
impl Keyable<UserKeys> for User {
    fn get_string(&self, key: UserKeys) -> Option<&String> {
        match key {
            UserKeys::Username => Some(&self.username),
            UserKeys::Password => Some(&self.password),
            _ => None
        }
    }
    fn get_i32(&self, key: UserKeys) -> Option<&i32> {
        match key {
            UserKeys::Id => Some(&self.id),
            _ => None
        }
    }
}

这将在 Rust 中创建一个有效的反射实现。值得注意的是,您不必手动输入所有这些内容;您可以考虑创建一个派生宏 (Rust Book)

然后你可以添加一个绑定到你的 EventEmitter 的类型,这样它就变成了:

struct EventEmitter<K, T: Keyable<K>> {
    pub listeners: Vec<Listener<T>>,
}

这段代码说“我想创建一个结构,它可以容纳具有特定键类型 (K) 的 Keyable (T) 类型的 Listener 的许多实例。

为了让您的事件全部连接起来,仍然需要做很多工作,但注意反射是一大步。

这是我编写的一个示例,它允许派生一个名为 ToJson 的结构。它允许所有实现者自动继承一个 to_json 函数,该函数创建一个包含其所有属性的字符串。 GitHub

【讨论】:

    猜你喜欢
    • 2022-08-21
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2022-01-18
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多