微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何表述函数的类型约束以允许添加不同类型的值?

如何解决如何表述函数的类型约束以允许添加不同类型的值?

我打算重载一些运算符,但我正在努力实现它,因为语法令人困惑。作为中间步骤,我正在尝试编写一个函数添加两个已经支持加法的值。我的函数将把 &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 天的月份中结束,或者在二月结束。月份和年份的长度各不相同,这使得这很棘手。这是一部分XPATH YearMonth 持续时间支持。)

解决方法

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

A

A: ops::Add<Duration,Output = A> // ^^^^^^^^ add this part trait(以及 Add 中的大部分 trait)有一个默认为 std::ops 的类型参数,所以当你写 Self 时,它的意思是 {{ 1}} 和 A: Add 表示 A: Add<A>。要将 A: Add<Output = A> 添加到 Add<A,Output = A>,您必须明确覆盖此默认值。

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

另见

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。