如何解决如何表述函数的类型约束以允许添加不同类型的值?
我打算重载一些运算符,但我正在努力实现它,因为语法令人困惑。作为中间步骤,我正在尝试编写一个函数来添加两个已经支持加法的值。我的函数将把 &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 天的月份中结束,或者在二月结束。月份和年份的长度各不相同,这使得这很棘手。这是一部分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 举报,一经查实,本站将立刻删除。