首页 文章

在Rust中使用supertrait的有界特征参数

提问于
浏览
1

我是Haskell和Rust的新手,我正在尝试将Haskell代码转换为Rust,以便比较支持通用性的功能 . 但是,似乎我需要帮助语法或Rust中的一些基本概念 .

我在Haskell中有这个代码:

class HasEmpty a where
    empty :: a
    isEmpty :: a -> Bool

class Hashable a where
    hash :: a -> Int

class (HasEmpty x, Hashable (Element x))
        => Hashset x where
    type Element x
    size :: x -> Int

重要的部分是在底部,我们定义了一个名为 Hashset 的类型类,它接受一个参数 x 和子类 HasEmpty . 类类的主体定义了一个关联类型,它必须是 Hashable ,以及一个关联的方法 size .

我怎么能在Rust做同样的事情?这是我到目前为止所写的内容:

trait HasEmpty {
    fn empty(&self);
    fn is_empty(&self) -> bool;
}

trait Hashable {
    fn hash(&self) -> u32;
}

trait Hashset<E>
    where E: Hashable
{
    fn size(&self) -> i32;
}

这编译并允许我说相关类型 E 是Hashable,但是如何将'trait methods' 'trait methods'作为超级用途?'trait methods'?我知道这可以说:

trait Hashset: HasEmpty {
    fn size(&self) -> i32;
}

但是它是否有可能约束相关类型并使用超级?也许我问的是错误的问题 .

1 回答

  • 1

    是否可以约束相关类型并使用超级?

    当然,我不确定为什么你不只是结合这两种语法:

    trait Hashset<E>: HasEmpty
        where E: Hashable
    {
        fn size(&self) -> i32;
    }
    

    但是,您应该知道 Enot 是一个关联类型,它只是一个泛型类型 . 有关详细信息,请参阅When is it appropriate to use an associated type versus a generic type? .

    相关类型将是:

    trait Hashset: HasEmpty {
        type E: Hashable;
        fn size(&self) -> i32;
    }
    

相关问题