簡體   English   中英

不依賴於泛型類型的特征或方法

[英]Trait or method that does not depend on generic type

我在 rust 中有一個通用結構,它有一個通用字段,在本例中為val和一個類型特定字段:

struct A<T> {
    val: i32,
    t: T
}

我想要做的是讓一個方法與結構相關聯,而不管類型T 我可以這樣稱呼的東西:

A::my_method()

代替:

A::<T>::my_method()

我嘗試在A<T>上實現一個名為Get的特性,並按如下方式調用它:

struct A<T> {
    val: i32,
    t: T
}

trait Get {
    type ValType;
    fn get_val() -> Self::ValType;
}

impl<T> Get for A<T> {
    type ValType = i32;
    
    fn get_val() -> Self::ValType {
        2
    }
}

fn main() {
    let a = A {
        val: 2,
        t: 3.0
    };
    
    // This is the call I want, if possible
    println!("{:?}", A::get_val());
}

問題是它無法編譯,這是可以預料的。 我想要的結果是這樣的:

impl<T> Get for A<any T> {
    type ValType = i32;
    
    fn get_val() -> Self::ValType {
        2
    }
}

我在一些帖子中發現解決方法是使用虛擬類型參數並將我的 function 稱為:

struct DummyType;

fn main() {
    let a = A {
        val: 2,
        t: 3.0
    };
    
    // This is the call I want, if possible
    println!("{:?}", A::<DummyType>::get_val());
}

您可能缺少的是方法接收器。


pub struct A<T> {
    pub field: usize,
    pub something: T,
}

pub trait Getter {
    type Output;
    fn get(&self) -> Self::Output;
}

impl<T> Getter for A<T> {
    type Output = usize;
    fn get(&self) -> Self::Output {
        self.field
    }
}

fn main() {
    let a = A { field: 10, something: 3.0 };
    assert_eq!(a.get(), 10);
}

在這里您可以返回A的 state 而不僅僅是常量。

首先,你的設計看起來不對。 如果類型是通用的,那么擁有非通用方法意味着什么?

無論如何,你可以使用一個哨兵類型(你不需要一個特征,我真的不明白你為什么把它放在第一位):

impl A<()> {
    fn get_val() -> i32 {
        2
    }
}

當您調用A::get_val()時,編譯器會自動將T推斷為() )。

游樂場

好吧,我試過了,rust 似乎沒問題:

pub trait Get {
    type Output;
    fn get() -> Self::Output;
}

pub struct A<T>(T);

impl Get for A<()> {
    type Output = usize;
    fn get() -> Self::Output {
        2
    }
}

fn main() {
    println!("{}", A::get());
}

()是這里的最佳選擇,因為您想表達該參數在這里對我們並不重要,但也不要為此聲明類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM