【问题标题】:How do I phrase a function's type constraint to permit the addition of values of different types?如何表达函数的类型约束以允许添加不同类型的值?
【发布时间】:2021-05-20 21:33:00
【问题描述】:

我打算重载一些运算符,但我正在努力实现它,因为语法令人费解。作为中间步骤,我正在尝试编写一个函数来添加两个已经支持加法的值。我的函数将接受 &A 和 B 类型的参数值,调用一个函数将 B 转换为 C,然后克隆 A,这样我就可以执行 A + C 来获取另一个 A 并返回它。为了简化这个问题,B 是 i64,C 是 Duration,来自 chrono 板条箱。

让我困惑的部分是类型边界。我怎么说你可以添加 A + Duration 来获得另一个 A(并直接获得生命周期)? A 不是Copy,但我很高兴克隆它。 A 的示例类型是 DateDatetime,它们都实现了 Datelike 特征。

use std::ops;
use chrono::Duration;
use chrono::{Date, Datelike, offset::TimeZone};

fn add_datelike_and_duration<A>(a: &A, days: i64) -> A 
where A: Datelike + Clone,
... something I can't figure out ... 
{
   let duration = Duration::days(days);
   let new_a = a.clone() + duration;
   let modified_new_a: A = ... do more stuff ...
   modified new_a
}

没用的是:

for<'a> 'a + A: ops::Add<Output = A>

(注意:这个函数稍微复杂一点。我正在将一种新的持续时间,即几年和几个月的数量转换为大致的天数,将它们添加到日期,然后向前或向后移动一些天匹配一个月中的一天,除非开始日是 31 日,而我们最终会在 30 天的月份中结束,或者在 2 月结束。月份和年份的长度会有所不同,这使得这很棘手。这是一部分XPATH YearMonth 持续时间支持。)

【问题讨论】:

    标签: generics rust operator-overloading type-constraints


    【解决方案1】:

    要说A 可以添加到Duration 以产生另一个A

    A: ops::Add<Duration, Output = A>
    //          ^^^^^^^^ add this part
    

    Add trait(连同 std::ops 中的大多数 trait)有一个默认为 Self 的类型参数,所以当你写 A: Add 时,它表示 A: Add&lt;A&gt;A: Add&lt;Output = A&gt; 表示 @987654334 @。要将A 添加到Duration,您必须明确覆盖此默认值。

    仅当您想添加引用时才需要添加生命周期 ('a)。

    另见

    【讨论】:

    • 成功了。谢谢。我看到的所有示例都是添加两个相同类型的。
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多