Rust 实现类似于C++';s`std::除锈?

Rust 实现类似于C++';s`std::除锈?,rust,Rust,如果类型是引用,我希望有一个工具从类型中删除引用。类似这样的代码(伪代码): C++在标准库中有一个函数,它可以完全满足我的要求。我试图在Rust中实现同样的功能,但无法使其工作。现在,在锈菌中“输出”类型的唯一方法是性状上的关联类型(我认为)。我试过这样的方法(): #![专题(专门化)] 性状去除因子{ 不带ref的类型; } T的默认impl-RemoveRef{ 不带ref的类型=T; } impl这里有一个简单的方法,不需要专门化功能: use std::marker::Phantom

如果类型是引用,我希望有一个工具从类型中删除引用。类似这样的代码(伪代码):

C++在标准库中有一个函数,它可以完全满足我的要求。我试图在Rust中实现同样的功能,但无法使其工作。现在,在锈菌中“输出”类型的唯一方法是性状上的关联类型(我认为)。我试过这样的方法():

#![专题(专门化)]
性状去除因子{
不带ref的类型;
}
T的默认impl-RemoveRef{
不带ref的类型=T;
}

impl这里有一个简单的方法,不需要专门化功能:

use std::marker::PhantomData;

trait RemoveRef {
    type WithoutRef;
}

struct Ref<T> {
    phantom: PhantomData<T>,
}

impl<T> RemoveRef for Ref<T> {
    type WithoutRef = T;
}

impl<'a, T: RemoveRef> RemoveRef for &'a T {
    type WithoutRef = T::WithoutRef;
}

fn main() {
    let _: <Ref<i32> as RemoveRef>::WithoutRef = 3;
    let _: <&Ref<i32> as RemoveRef>::WithoutRef = 3;
    let _: <&&&&Ref<i32> as RemoveRef>::WithoutRef = 3;
}
这将启用原始测试代码:

let _: <i32 as RemoveRef>::WithoutRef = 3;
let _: <&i32 as RemoveRef>::WithoutRef = 3;
let _: <&&i32 as RemoveRef>::WithoutRef = 3;
错误[E0308]:类型不匹配
-->src/main.rs:16:45
|
16 | let::WithoutRef=3;
|^应为关联类型,找到整型变量
|
=注意:应为类型“”::WithoutRef`
找到类型`{integer}`

这与此处讨论的原因相同:将
T
分配给
WithoutRef
default
结合使用不会将
WithoutRef
限制为类型
T

是否应限制为
Copy
类型,如
i32
?在这种情况下,
remove_-ref
函数可以如下所示:
fn remove_-ref(t:&t)->t{*t}
示例用法:
let i=remove_-ref::(&mut&&mut 42)
@Calculator谢谢您的评论!不幸的是,我不是这个意思。我现在明白了,一开始我的伪代码有点混乱。Rust函数从一个值映射到另一个值。我想要从一种类型映射到另一种类型的东西(我认为这只能通过特征来实现)。我的问题不在乎实际价值。谢谢!很有趣,我没想到这个解决方案。遗憾的是,
Ref
实现实际上对我的实际用例没有帮助。遗憾的是,这可能不适用于专业化:/我认为这个问题实际上可以通过。合并后,我将重新讨论这个问题。
let _: <i32 as RemoveRef>::WithoutRef = 3;
let _: <&i32 as RemoveRef>::WithoutRef = 3;
let _: <&&i32 as RemoveRef>::WithoutRef = 3;
use std::marker::PhantomData;

trait RemoveRef {
    type WithoutRef;
}

struct Ref<T> {
    phantom: PhantomData<T>,
}

impl<T> RemoveRef for Ref<T> {
    type WithoutRef = T;
}

impl<'a, T: RemoveRef> RemoveRef for &'a T {
    type WithoutRef = T::WithoutRef;
}

fn main() {
    let _: <Ref<i32> as RemoveRef>::WithoutRef = 3;
    let _: <&Ref<i32> as RemoveRef>::WithoutRef = 3;
    let _: <&&&&Ref<i32> as RemoveRef>::WithoutRef = 3;
}
impl RemoveRef for i32 {
    type WithoutRef = Self;
}
let _: <i32 as RemoveRef>::WithoutRef = 3;
let _: <&i32 as RemoveRef>::WithoutRef = 3;
let _: <&&i32 as RemoveRef>::WithoutRef = 3;
impl<T> RemoveRef for T {
    default type WithoutRef = T;
}