【发布时间】: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 的示例类型是 Date 和 Datetime,它们都实现了 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