generics - 我可以在 Rust 中使这个断言通用吗?

标签 generics rust traits

我试图断言其他人的箱子中的函数返回的类型足够大,如果他们将他们的代码更改为仍然可以的东西,我不想更改我的代码。

这是我正在尝试做的事情的简化版本 ( playground ):

const NANOSECONDS_IN_DAY:f64 = 8.64E13;
trait HasMax<T> {
    fn max_value() -> T;
}
fn max_of<T:HasMax>(_: &T) -> T {
    T::max_value()
}
fn main() {
    let mv = max_of(&1f64);
    assert!(mv > NANOSECONDS_IN_DAY, "type is too small");
}

但是我得到以下错误:

<anon>:5:13: 5:19 error: wrong number of type arguments: expected 1, found 0 [E0243]
<anon>:5 fn max_of<T:HasMax>(_: &T) -> T {
                     ^~~~~~

最佳答案

尽管您正在使用的库中 future 未知的破坏性 API 更改,但试图让您的代码正常工作充其量是错误的。简短的回答是,如果您正在使用的库的 API 发生变化,您的代码最好编译失败,而不是以更微妙或难以检测的方式失败。但我可以回答为什么您的代码无法编译。

问题出在您的特征定义中,它使用了泛型。你的特征应该是 HasMax , 不是 HasMax<T> .

const NANOSECONDS_IN_DAY:f64 = 8.64E13;
trait HasMax {
    fn max_value() -> Self;
}
fn max_of<T:HasMax>(_: &T) -> T {
    T::max_value()
}
impl HasMax for f64 {
    fn max_value() -> Self {
        std::f64::MAX
    }
}
fn main() {
    let mv = max_of(&1f64);
    assert!(mv > NANOSECONDS_IN_DAY, "type is too small");
}

关于generics - 我可以在 Rust 中使这个断言通用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35489806/

相关文章:

c# - 将 ComponentRegistration 向下转换为非泛型类型

c# - 泛型和可空类型

c# - 泛型方法签名和标准签名相同

java - 原始类型和数据完整性列表

rust - Vec和HashMap之间的特征对象差异

enums - 如何读取与 Rust 中的自定义类型关联的枚举值?

rust - 借用检查器没有意识到 `clear` 丢弃了对局部变量的引用

rust - 如何使简单的 futures::sync::mpsc::channel 示例工作?

io - 如果无法查找标准输入,我如何从标准输入或文件获取输入?

java - Java是否允许类型参数为类型参数?