gpt4 book ai didi

rust - 从可以接受拥有或借用的值作为输入的特征方法中仅返回拥有的类型

转载 作者:行者123 更新时间:2023-12-04 13:26:23 25 4
gpt4 key购买 nike

我想要一个可以为 T 实现的特性和 &T但有方法总是返回 T .
我想做的是这样的事情

use std::borrow::ToOwned;

trait Foo<X: ToOwned> {
fn f(&self, x: X) -> f64;

fn g(&self) -> X::Owned;
}

struct Float(f64);

impl Foo<f64> for Float {
fn f(&self, x: f64) -> f64 {
x + self.0
}

fn g(&self) -> f64 {
self.0 * 2.0
}
}

struct List(Vec<f64>);

impl Foo<&Vec<f64>> for List {
fn f(&self, x: &Vec<f64>) -> f64 {
x.iter().sum()
}

// Error here - `&Vec<f64>` return type expected
fn g(&self) -> Vec<f64> {
self.0.iter().map(|&x| 2.0 * x).collect()
}
}

fn main() {
let float = Float(2.0);
println!("{} {}", float.f(3.0), float.g());

let list = List(vec![0.0, 1.0, 2.0]);
println!("{} {:?}", list.f(&vec![1.0, 2.0]), list.g());
}
我知道一种选择是拥有一个像这样定义输出类型的特征
trait FooReturn {
type Output;
}

trait Foo<X: FooReturn> {
fn f(&self, x: X) -> f64;

fn g(&self) -> X::Output;
}
然后为所有相关类型实现特征,但我想知道是否有更标准/更强大的方法来做到这一点。

最佳答案

一旦特化完成,您就会这样做。同时,我什至无法得到一个简单的工作示例来编译 1.55.0-nightly .

#![feature(specialization)]

trait MaybeOwned {
type Owned;
}

default impl<X> MaybeOwned for X {
type Owned = X;
}

impl<'a, X> MaybeOwned for &'a X {
type Owned = X;
}

trait Foo<X: MaybeOwned> {
fn f(&self, x: &X) -> f64;
fn g(&self) -> <X as MaybeOwned>::Owned;
}

关于rust - 从可以接受拥有或借用的值作为输入的特征方法中仅返回拥有的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68321796/

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