gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:36:12 25 4
gpt4 key购买 nike

我打算重载一些运算符,但由于语法令人困惑,我正在努力解决。作为中间步骤,我试图编写一个函数,将两个已经支持加法的值相加。我的函数将把&A和B类型的值作为参数,调用一个函数将B变成C,然后克隆A,这样我就可以执行A + C来获得另一个A并返回它。为了简化此问题,在i64 crate 中,B是Duration,C是chrono
使我感到困惑的部分是类型界限。 我怎么说,您可以添加A +持续时间来获得另一个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的一部分持续时间支持。)

最佳答案

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

A: ops::Add<Duration, Output = A>
// ^^^^^^^^ add this part
Add特征(以及 std::ops中的大多数特征)具有默认为 Self的类型参数,因此,当您编写 A: Add时,它意味着 A: Add<A>,而 A: Add<Output = A>则意味着 Add<A, Output = A>。要将 A添加到 Duration,您必须显式覆盖此默认值。
仅当您要添加引用时,才需要添加生存期( 'a)。
也可以看看
  • How do I require a generic type implement an operation like Add, Sub, Mul, or Div in a generic function?
  • How to write a trait bound for adding two references of a generic type?
  • How do I use integer number literals when using generic types?
  • 关于generics - 如何表达函数的类型约束以允许添加不同类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66251367/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com